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