代码之家  ›  专栏  ›  技术社区  ›  Daniel

螺纹环基准

  •  9
  • Daniel  · 技术社区  · 14 年前

    今天我在做线环练习 编程Erlang 预订并搜索其他解决方案进行比较。我发现语言枪击和 benchmark . 我的印象是,这是一个区域,Erlang应该是快的,但事实证明,C和C++是在顶部。我的怀疑是C/C++程序没有遵循“从线程到线程传递令牌”的规则。在阅读了它们之后,似乎它们都操作了一些共享内存和全局变量,这与Erlang代码不同,但我可能错了。

    我的问题是:他们是做同样的事情还是C/C++代码在概念上不同(更快)?

    另一个问题是:当解决方案非常相似时,为什么Haskell比Erlang更快?

    7 回复  |  直到 10 年前
        1
  •  6
  •   Neil Brown    14 年前

    最后,现代机器上的消息传递是使用某种形式的共享内存来传递消息(以及锁或原子指令)。因此,所有C和C++的实现都是将消息传递的实现直接嵌入到代码中。本文还提供了一个类似的基准测试,该测试使用C中的快速消息传递库,也针对Haskell和Erlang进行了基准测试: http://www.cs.kent.ac.uk/pubs/2009/2928/index.html (第5.1节)

    各种方法的速度实际上是由所涉及的并发运行时系统决定的。哈斯克尔在这方面做了很多出色的工作,使它领先于二郎。当然,在微基准上测量速度常常是错误的,并且遗漏了诸如代码可读性之类的重要因素。要记住的一个问题可能是:在拍摄过程中,您愿意保持哪些解决方案?

        2
  •  9
  •   Simon Marlow    14 年前

    C版本使用的是LWP,我认为它是一个用户空间线程库。在多大程度上,这是“不公平的”值得争论:我会看看它是否支持真正的先发制人的并发性,从这个意义上说,您可以在线程中进行阻塞系统调用而不阻塞所有其他线程(您可以在Haskell中这样做,可以在Erlang中吗?).

    haskell的线程比erlang的稍微轻一些,因为据我所知,erlang线程带有一个本地堆(在标准实现中),而haskell线程都共享同一个堆。

        3
  •  5
  •   Jerry Coffin    14 年前

    我不认为这叫作弊。多个线程和多个进程的主要根本区别在于多个线程共享一个地址空间。因此,在我看来,指定多个线程(而不是多个进程)似乎像是利用共享地址空间的默认权限(至少在没有一些非常具体的“传递”定义禁止这样做的情况下)。

    归根结底,它是这样的:Erlang实际上没有线程——它有异步通信的进程。这些过程在很大程度上是(有意)相互孤立的。一方面,这使得开发变得相当容易——特别是,一个过程只能通过特定的、明确定义的通信渠道影响另一个过程。在这种情况下,它使用许多技巧(几乎可以肯定包括共享内存)来优化其进程,并利用特定实现/情况下可能发生的情况(例如,在单个共享地址空间中运行的所有进程)。尽管如此,必须隐藏所有的技巧,才能使它不像C版本那样高效,“技巧”都是显式的和完全公开的。

    我会用现实生活中的类比来解释这种差异。把线程/进程想象成人。Erlang实施了一种专业的工作关系,在这种关系中,所有的沟通都被仔细记录在备忘录中。C和C++版本更像是一对夫妻,他们可以用一个词来表达,这对任何人来说都不是什么意思,甚至只是一个简单的一瞥。

    后者在工作时非常有效——但它更容易引起细微的误解,如果两人发生争执,你可能不想呆在同一个房间里。对于经理来说,纯职业关系的人更容易管理,即使他们的最高效率不是很高。

        4
  •  4
  •   Don Stewart    14 年前

    当解决方案非常相似时,为什么Haskell比Erlang更快?

    HaskellGHC是一种编译的、本机代码优化的语言实现,具有非常快的线程。它通常比Erlang/Hipe快得多。Erlang对轻量级线程没有垄断权:—)

        5
  •  4
  •   Matthieu M.    14 年前

    我会回答另一个问题:erlang运行时是如何在引擎盖下实现的?

    很可能它是用C或类似的系统语言实现的(我怀疑它们都是在汇编中实现的)。或者至少,他们表达的概念可以用C语言有效地表达。

    现在,考虑到Erlang增加了自己的复杂性/间接性,为什么你会觉得一个优化的C版本(shootout肯定不会显示平均级别的代码)会打败Erlang版本这么奇怪呢?

    无论基准的类型是什么,C实现总是有可能用另一种语言击败最优秀的程序…建立在C之上,仅仅因为您使用它生成的C版本,然后删除您不需要的位。

    另一方面:

    • 你花了多少时间编写代码?
    • 你对它做对的事情的信任程度是多少?不会死锁吗?
    • 你想养哪一个?

    有时候,“更快”只是不值得付出代价。

        6
  •  2
  •   igouy peenut    14 年前

    不遵守规则

    考虑到在编程并发性方面有多少种真正完全不同的方法,我确实发现很难同时具有足够的包容性来引入不同的语言实现,同时保留一些模糊的可比性。

    现在看看用 different run time configuration 注意这有多重要-

    SMP quad core 
    1.0 C GNU gcc #3    4.16    4.17    16,952  607   100% 0% 1% 0%
    4.2 Haskell GHC     17.99   17.42   4,020   307   100% 1% 1% 1%
    7.5 Erlang HiPE     31.12   31.13   10,504  273   0% 0% 0% 100%
    
    No SMP one core
    1.0 C GNU gcc #3    4.16    4.16    16,952  607   1% 0% 0% 100%
    1.4 Haskell GHC     5.89    5.89    3,204   307   0% 0% 0% 100%
    2.6 Erlang HiPE     10.64   10.63   9,276   273   0% 0% 0% 100%
    
        7
  •  1
  •   Daniel Luna    14 年前

    在这个基准中需要注意的一点是,只有一个令牌可以传递。这意味着在实践中,它只是一个从内存读写的单线程程序。

    我希望在多处理器机器(或使其成为集群)上得到不同的结果,其中线程/进程必须以某种随机顺序传递M令牌。

    hmm.还为基准解决方案的开发人员提供相等的完成解决方案的小时数。然后我希望二郎能登上榜首(或者至少接近榜首)。