我目前正在阅读/学习 Erlang,并且经常注意到它(真的)不适合“大量计算”。现在我经常遇到这个短语或类似的词,但从来不知道“重”到底是什么意思。
如何确定一项操作是否是计算密集型的?可以在测试前量化吗?
编辑:
计算量、算法复杂度或输入值大小之间是否存在差异。
例如1000 computaions of 28303 / 4
vs100 computations of 239847982628763482 / 238742
我目前正在阅读/学习 Erlang,并且经常注意到它(真的)不适合“大量计算”。现在我经常遇到这个短语或类似的词,但从来不知道“重”到底是什么意思。
如何确定一项操作是否是计算密集型的?可以在测试前量化吗?
编辑:
计算量、算法复杂度或输入值大小之间是否存在差异。
例如1000 computaions of 28303 / 4
vs100 computations of 239847982628763482 / 238742
当您具体谈论 Erlang 时,我怀疑您是否总体上想要开发需要使用它进行密集数字运算的应用程序。也就是说——你不需要学习 Erlang 来编写物理引擎。所以不要担心 Erlang 对你来说太慢了。
从 Erlang 到一般问题,这些事情几乎总是归结为相对论。让我们忽略数字运算,问一个关于编程的一般性问题:多快才足够快?
那么,足够快取决于:
如果在某些程序中读取文件需要 1 毫秒或 1000 毫秒 - 1000 毫秒是否被认为“太慢”?
如果必须快速连续读取十个文件 - 是的,可能太慢了。想象一个 XML 解析器只需 1 秒就可以从磁盘读取一个 XML 文件——太可怕了!
另一方面,如果仅当用户每 15 分钟左右手动单击一个按钮时才需要读取文件,那么这不是问题,例如在 Microsoft Word 中。
没有人确切地说太慢的原因是因为它并不重要。您的具体问题也是如此。一种语言应该很少(如果有的话)因为“慢”而被回避。
最后但并非最不重要的一点是,如果您在 Erlang 中开发了一些可怕的项目,并且在以后的道路上,意识到那个dagnabbit!您确实需要处理这些数字 - 然后您进行研究,找到好的库并以最适合它的语言实现算法,然后与那个小型库进行互操作。
我曾经问过一个关于 couch DB mapreduce 中的数字运算的问题:CouchDB Views:在 map reduce 中可以接受多少处理?
其中一个答案有趣的是:
假设您有 10,000 个文档,每个文档需要 1 秒来处理(这比我见过的要高得多)。也就是说,完全构建视图需要 10,000 秒或 2.8 小时。但是,一旦视图完成,查询任何行 (?key=...) 或行切片 (?startkey=...&endkey=...) 与直接查询文档所花费的时间相同。文档计数的查找时间为 O(log n)。
换句话说,即使每个文档需要 1 秒来执行映射,也需要几毫秒来获取结果。(当然,视图必须先构建,因为它实际上是一个索引。)
我认为,如果您从这些方面考虑您当前的问题,那么考虑您的问题是一个有趣的角度。关于语言速度/优化的话题:
如何确定一项操作是否是计算密集型的?
Facebook 问了这个关于 PHP 的问题,最后写了HIP HOP来解决这个问题——它将 PHP 编译成 C++。他们说php 比 C++ 慢得多的原因是因为 PHP 语言都是动态查找的,因此需要大量处理来处理变量、数组、动态类型(这是减速的根源)等。
所以,你可以问一个问题:erlang 是动态查找吗?静态类型?编译?
计算量、算法复杂度或输入值大小之间是否存在差异。例如 28303 / 4 的 1000 次计算与 239847982628763482 / 238742 的 100 次计算
因此,话虽如此,您甚至可以将特定类型授予不同类型的数字,这意味着您应该使用正确的类型,这肯定会导致性能提高。
有了这种东西,你看到就知道了!通常这指的是当您选择 int、float、double 等重要的情况时。诸如物理模拟或蒙特卡洛方法之类的事情,您想要进行数百万次计算。
老实说,实际上您只需用 C 语言编写这些位,然后使用您最喜欢的其他语言来运行它们。
数字运算的适用性取决于库支持和语言的固有性质。例如,纯函数式语言不允许任何可变变量,这使得实现任何方程求解类型的问题变得非常有趣。Erlang 可能属于这一类。