在不处理慢速 IO 时,从性能的角度来看使用响应式编程是否有意义?
Does it make sense to use Reactive Programming from a performance standpoint when not dealing with slow IO?
使用响应式编程,例如 Java 和 Project Reactor 在处理慢速 IO 时或当您想要将结果流回最终用户时非常有意义。您编写的代码往往看起来更简洁——类似于使用函数式编程和流时——但您也被迫以不同的方式编写代码,这让刚接触该概念的程序员的生活更加艰难。
我想知道从性能的角度来看,使用它是否有意义?如果程序除了某些屏幕输出(例如计算无限 PI 数字或斐波那契数列)之外没有任何 I/O,它不会减慢您的计算速度吗?还是您的代码清洁度的提高使它成为一个很小的代价?
据我了解,反应式编程不仅与性能有关,还与可伸缩性有关,当您知道您的应用程序对未来的需求会越来越大并且您计划架构时,您想使用反应式编程为了处理那个。除了反应式编程之外,还有其他一些技术,如微服务或 SOA 来处理这个问题。
在我看来,使用这种策略完全取决于问题,因为没有什么是免费的,而且当你开发这种架构时,通常开发时间会更长,具体取决于(you/your 团队)经验。
要向您的客户端发送数据,您可以使用其他技术,例如使用网络套接字轮询或推送数据,或者 queues/topics 您 post 更新数据。
这取决于您要解决的问题 - 但如果您仅从严格的性能角度来看这个问题?可能不是,但是...
- 每个新的 concept/paradigm 一开始都被认为是困难的。
总是很难改变一个人的思维方式来吸收
观念转变。
Reactive
不应该解决性能问题(除非你做了很多
阻塞),但由于异步消息驱动的架构,整体 responsiveness/scalability/resiliency 系统得到改善。
- 通过使用声明式方法,您可以实现使用反应式编写的真正的控制反转(是的,这不仅仅是依赖注入)代码
方法看起来不一样但是更简单因为你抽象出了处理异步计算、线程管理、调度、并行数据流的组成、背压等,不需要处理自己动手(想象一下稍后重构)
所以,经典的异步方法是处理慢IO的一种解决方案。反应式方法远不止于此。
一般来说,不同的范式适用于不同的问题,可能的事实是,一个问题可以通过这些范式的组合来解决。这是 Brian Goetz 关于它的轻量级 talk。你不能概括 "use RP when dealing with slow I/O and FP when calculating PI" 或类似的东西。
您在这里涉及几个完全正交的主题。
The code you write tends to look cleaner
完全取决于语言的语法及其提供的功能。 Java 有 JavaFX 绑定 API 可以使 RP 在 Java 中非常干净,但没有它它看起来会很乱。例如,在语言 A 中,结果不绑定到它的参数,如果你确实希望它表现得反应性,你必须声明它:
a = b + c;
b = b + 1; // a doesn't change
a = react(b + c);
b = b + 1; // a increases by 1
所以RP在这个语言里比较乱。在语言 B 中,情况恰恰相反 - 默认情况下结果是绑定的,如果你不想要你必须指定它,所以实现 RP 不那么混乱,但实现其他东西更混乱。
but you're also forced to write things differently, which makes life harder for programmers new to the concept.
对于任何范例都是如此。当 OO 出现时,情况不也是如此吗?想想那些一直在做 FP 的人,现在他们需要阅读 OO 代码。他们的生活同样艰难。
I was wondering whether it makes sense to use from a performance standpoint in general?
为什么不呢?使用惰性计算,您几乎没有性能问题。在上面的代码示例中,如果未使用 a
的值,则 a
不需要在每次 b
或 c
更改时更新。将伪代码 react
视为指定公式 - "do this when you need the value of a
" - 而不是常量关系 - "a must always be this".
这也是 JavaFX 绑定的作用。持续更新所有绑定值将非常昂贵。每当发生读取操作时,然后并且仅更新该值并return它。
问题是:值应该 对变化做出反应,而不是这样做是否更易于阅读或具有更好的性能。
使用响应式编程,例如 Java 和 Project Reactor 在处理慢速 IO 时或当您想要将结果流回最终用户时非常有意义。您编写的代码往往看起来更简洁——类似于使用函数式编程和流时——但您也被迫以不同的方式编写代码,这让刚接触该概念的程序员的生活更加艰难。
我想知道从性能的角度来看,使用它是否有意义?如果程序除了某些屏幕输出(例如计算无限 PI 数字或斐波那契数列)之外没有任何 I/O,它不会减慢您的计算速度吗?还是您的代码清洁度的提高使它成为一个很小的代价?
据我了解,反应式编程不仅与性能有关,还与可伸缩性有关,当您知道您的应用程序对未来的需求会越来越大并且您计划架构时,您想使用反应式编程为了处理那个。除了反应式编程之外,还有其他一些技术,如微服务或 SOA 来处理这个问题。
在我看来,使用这种策略完全取决于问题,因为没有什么是免费的,而且当你开发这种架构时,通常开发时间会更长,具体取决于(you/your 团队)经验。
要向您的客户端发送数据,您可以使用其他技术,例如使用网络套接字轮询或推送数据,或者 queues/topics 您 post 更新数据。
这取决于您要解决的问题 - 但如果您仅从严格的性能角度来看这个问题?可能不是,但是...
- 每个新的 concept/paradigm 一开始都被认为是困难的。
总是很难改变一个人的思维方式来吸收
观念转变。 Reactive
不应该解决性能问题(除非你做了很多 阻塞),但由于异步消息驱动的架构,整体 responsiveness/scalability/resiliency 系统得到改善。- 通过使用声明式方法,您可以实现使用反应式编写的真正的控制反转(是的,这不仅仅是依赖注入)代码 方法看起来不一样但是更简单因为你抽象出了处理异步计算、线程管理、调度、并行数据流的组成、背压等,不需要处理自己动手(想象一下稍后重构)
所以,经典的异步方法是处理慢IO的一种解决方案。反应式方法远不止于此。
一般来说,不同的范式适用于不同的问题,可能的事实是,一个问题可以通过这些范式的组合来解决。这是 Brian Goetz 关于它的轻量级 talk。你不能概括 "use RP when dealing with slow I/O and FP when calculating PI" 或类似的东西。
您在这里涉及几个完全正交的主题。
The code you write tends to look cleaner
完全取决于语言的语法及其提供的功能。 Java 有 JavaFX 绑定 API 可以使 RP 在 Java 中非常干净,但没有它它看起来会很乱。例如,在语言 A 中,结果不绑定到它的参数,如果你确实希望它表现得反应性,你必须声明它:
a = b + c;
b = b + 1; // a doesn't change
a = react(b + c);
b = b + 1; // a increases by 1
所以RP在这个语言里比较乱。在语言 B 中,情况恰恰相反 - 默认情况下结果是绑定的,如果你不想要你必须指定它,所以实现 RP 不那么混乱,但实现其他东西更混乱。
but you're also forced to write things differently, which makes life harder for programmers new to the concept.
对于任何范例都是如此。当 OO 出现时,情况不也是如此吗?想想那些一直在做 FP 的人,现在他们需要阅读 OO 代码。他们的生活同样艰难。
I was wondering whether it makes sense to use from a performance standpoint in general?
为什么不呢?使用惰性计算,您几乎没有性能问题。在上面的代码示例中,如果未使用 a
的值,则 a
不需要在每次 b
或 c
更改时更新。将伪代码 react
视为指定公式 - "do this when you need the value of a
" - 而不是常量关系 - "a must always be this".
这也是 JavaFX 绑定的作用。持续更新所有绑定值将非常昂贵。每当发生读取操作时,然后并且仅更新该值并return它。
问题是:值应该 对变化做出反应,而不是这样做是否更易于阅读或具有更好的性能。