Multithreading 好的多线程设计是否过早优化?

Multithreading 好的多线程设计是否过早优化?,multithreading,optimization,Multithreading,Optimization,虽然我喜欢多核系统设计带来的智力挑战,但我意识到其中大多数都是不必要的过早优化 但另一方面,通常所有的系统都有一些性能需求,并且以后将其重构为多线程安全操作是很困难的,甚至在经济上是不可能的,因为这将是用另一种算法进行的完全重写 在优化和完成任务之间保持平衡的方法是什么?引入线程并不会自动提高性能。如果您要做一些复杂的多线程的事情,最好事先考虑/设计好。否则,您的程序将要么是一场彻底的灾难,要么在大部分时间都能完美地工作,而在另一部分时间则会做一些疯狂的事情。很难用多线程设计出可以证明正确的东西

虽然我喜欢多核系统设计带来的智力挑战,但我意识到其中大多数都是不必要的过早优化

但另一方面,通常所有的系统都有一些性能需求,并且以后将其重构为多线程安全操作是很困难的,甚至在经济上是不可能的,因为这将是用另一种算法进行的完全重写


在优化和完成任务之间保持平衡的方法是什么?

引入线程并不会自动提高性能。

如果您要做一些复杂的多线程的事情,最好事先考虑/设计好。否则,您的程序将要么是一场彻底的灾难,要么在大部分时间都能完美地工作,而在另一部分时间则会做一些疯狂的事情。很难用多线程设计出可以证明正确的东西,但是它非常重要。因此,不,我不认为好的多线程设计是过早的优化。

也许好的事情是设计具有某些特性的系统,因此如果你想引入多线程,你可以优雅地进行

我不确定这些特征是什么,但我想到了一个类似的例子:缩放。如果您为无状态系统可以执行的小型操作而设计,您将能够更自然地进行扩展

这种事情对我来说很重要

如果它是为多线程设计的。。。那么,采取不成熟的方法很重要

如果只是为了确保某些特性在将来允许扩展或多线程:那么就不那么重要了:)

编辑哎呀,我又读了一遍:过早优化


优化:我不认为它是好的,直到你的系统工作(并且没有来自尝试优化事物的恶习)。做一个干净的设计,最灵活、最简单的设计。接下来,您可以在看到真正需要的内容时进行优化。

我相信线程也遵循优化法则。
也就是说,不要浪费时间进行快速并行操作。
相反,将线程应用于执行时间较长的任务


当然,如果系统开始有1000多个内核,那么这个答案可能会过时,需要修改。但话说回来,如果你想“完成任务”,那么你肯定会希望在那之前发货。

如果你遵循管道和地图缩小设计模式,那就足够了。
分解事物,以便可以在操作系统级别的多处理管道中运行

然后可以在实际管道中实际运行。没有额外的工作。操作系统处理一切。巨大的加速机会


您也可以切换到线程。一点工作。操作系统处理其中的一些部分,线程库处理其余部分。然而,由于您在设计时考虑的是“进程”,所以您的线程没有任何令人困惑的数据共享问题。一点点思考就能获得巨大的成功。

他们说,几天的编码可以节省设计时间

并非所有的问题或框架都是多线程的。例如,您所依赖的库可能不是线程安全的。许多过程自然是连续的,不能分解为可并行的部分

多线程/多处理只是并行化的一种方式。例如,您还可以使用异步IO


根据我的经验,从单线程异步要比多线程异步明智得多。但是,我编写的程序解决了不同的问题,好的,几乎所有其他人。

< P>我决不会考虑纯粹为了推测性能考虑而在应用程序中设计多线程。这是因为有了一些适用于任何应用程序的技术,以后就很容易实现多线程操作。我想到的技术是:

  • 硬合同
    • 在C++中,可以将方法标记为const,这意味着它不会改变实例变量的值。您还可以将方法的输入参数标记为const,这意味着只能对该参数调用const方法。使用这两种技术(并且不使用“技巧”绕过这些编译器强制),您可以减少需要多线程感知的操作
  • 依赖倒置
    • 这是一种通用技术,其中对象所需的任何外部对象在构造/初始化时传递给它,或者作为特定方法的方法签名的一部分。使用此技术,可以100%清楚地知道哪些对象可能会被操作更改(非常量实例变量加上操作的非常量参数)。知道了这一点,您就知道操作的非功能方面的范围,并且可以向可在并行操作之间共享的对象添加互斥对象等。然后,您可以将并行性设计为正确和高效
  • 重功能轻程序
    • 讽刺的是,这意味着不要过早地优化。使值对象不可变。例如,在C#中,字符串是不可变的,这意味着对它们的任何操作都返回字符串对象的新实例,而不是现有字符串的修改实例。唯一不应该是不可变的对象是无界数组或包含无界数组的对象,如果这些数组可能经常被修改的话。我认为不可变对象更容易理解。许多程序员都学过过程性技术,所以这对我们来说有些陌生,但是当你开始用不变的术语思考时,过程性编程的可怕方面,如操作顺序依赖性和副作用就消失了。在多线程编程中,这些方面甚至更可怕,因此在类设计中使用函数式有助于