使用 JavaScript (CoffeeScript)实施繁重的计算任务有多糟糕?我关注优化问题,其中无法快速计算出最佳解决方案。
首先选择JavaScript,因为可视化是必需的,而不是为不同进程之间的通信添加开销,而是决定在JavaScript中实现所有内容。
我没有看到问题,特别是在查看benchmarks game时。但我经常会收到这样的问题:为什么在地球上使用JavaScript?
我会以下列方式争论:这是一个优化问题, NP-hard 。 与另一种语言相比更快无关紧要,因为只有为运行时间添加一个常数因子 - 这是真的吗?
答案 0 :(得分:2)
Brendan Eich(Mozilla的CTO和JavaScript的创建者)似乎也这么认为。
http://brendaneich.com/2011/09/capitoljs-rivertrail/
我上周在Mozilla全力以赴的时候抽出时间在英特尔开发者论坛上帮助推出RiverTrail,英特尔的Parallel JS技术演示器 - 利用多核(CPU)和最终图形的GPU(GPU) )并行处理能力,没有共享内存线程(吮吸)。
特别参见他创建场景图的JS演示:
这是我演示的截屏视频。唉,由于RiverTrail目前以CPU及其短向量单元(SSE4)为目标,而我的截屏软件使用相同的并行硬件,因此帧速率不是应有的。但不用担心,我们也在努力开发GPU。
在CapitolJS并且没有运行ScreenFlow时,我看到Parallel演示的帧速率高于35,而Sequential则为3或2。
答案 1 :(得分:1)
如果JavaScript适合您并满足您的要求,您还关心其他人的想法?
回答这个问题的一种方法是将其与“良好”语言(您的条款,而不是我的语言)的实施进行基准比较,看看它有多大差异。
我不买可视化参数。如果您的“好”语言实现与前端通信,您可能能够获得更快的性能和可视化。你可能会夸大沟通成本,让自己感觉更好。
我也不喜欢你的最后一个论点。 JavaScript是单线程的;另一种语言可能提供JavaScript无法实现的并行性。算法可以产生巨大的差异;也许你已经找到了一个远非最优的。
我可以告诉你,没有一个心智正常的人会考虑将JavaScript用于计算密集型任务,如科学计算。 SO确实提到了JavaScript linear algebra library,但我怀疑它可以用于分析非线性系统将有数百万的自由度。我不知道你正在处理什么样的优化问题。
话虽如此,我想知道是否可以在这样的论坛中公平对待这个问题。这可能导致很多来回和争论。
您是在为自己的观点寻求理由,还是想要其他选择?这很难说。
答案 2 :(得分:1)
通常,它的测量时间通常比Java慢X倍。但是,正如你从基准枪战的结果中看到的那样,它实际上取决于算法的速度有多慢。这是V8的javascript,所以它将取决于您运行它的浏览器速度有多慢。 V8在这方面表现最佳,但在其他虚拟机上运行速度可能会大幅提升:~2x-10x。
如果您的问题可以细分为并行处理器,那么新的Workers API可以显着提高Javascript的性能。所以它不再是单线程访问,它可以非常快。
可视化可以从服务器或客户端完成。如果您认为很多人会立即执行您的程序,您可能不希望在服务器上运行它。如果其中一个吃了多少处理器认为它们中的1000个会对您的服务器做什么。使用Javascript,您可以通过联合所有浏览器获得廉价的并行处理器。但是,就可视化而言,它可以在服务器上完成并在其工作时发送给客户端。这就是你认为更容易的事情。
答案 3 :(得分:1)
回答这个问题的唯一方法是测量和评估这些测量,因为每个问题和应用都有不同的需求。没有绝对的答案涵盖所有情况。
如果您在javascript中实现您的应用/算法,请通过javascript来查找性能瓶颈所在并尽可能地优化它们,并且对于您的应用来说仍然太慢,那么您需要采用不同的方法。
另一方面,如果你已经知道这是一个大量耗时的问题,即使用最快的语言,它仍然是你的应用程序性能的一个有意义的瓶颈,那么你已经知道javascript是不是最好的选择,因为它很少(如果有的话)是最快的执行选项。在这种情况下,您需要弄清楚某种本机代码实现与浏览器之间的通信是否可行,并且表现是否足够好并从那里开始。
至于NP-hard与常数因素,我认为你在愚弄自己。 NP-hard意味着您需要首先使算法尽可能智能,这样您就可以将计算减少到最小/最快的问题。但是,即便如此,常数因素对您的应用仍然具有重大意义。一个常数因子很容易就是2倍甚至10倍,即使是不变的,这仍然是非常有意义的。想象一下,NP-hard部分在本机代码中是20秒,并且javascript的常数因子慢了10倍。现在你看20秒对200秒。这可能是可能对用户起作用的东西和可能不起作用的东西之间的区别。