代码之家  ›  专栏  ›  技术社区  ›  Richard Simões

为什么这个特定Perl脚本的线程版本比非线程版本慢200倍?

  •  8
  • Richard Simões  · 技术社区  · 15 年前

    presentation 通过 Mikhael Goikhman 来自2003年Perl会议的文章包括两个质数查找脚本示例。 One 是螺纹的,并且 other 事实并非如此。在运行脚本时(打印行被注释掉),我在非线程脚本上得到了0.011s的执行时间,以及2.343(!)线程版本上的秒数。是什么原因造成了时间上的惊人差异?

    4 回复  |  直到 15 年前
        1
  •  12
  •   Jay P.    15 年前

    我是一个Python爱好者,不是Perl,所以我对代码的作用只有一个模糊的概念。但是,当您看到队列时,请务必小心。Python有一个线程安全队列,看起来Perl也有。它们非常出色,为您提供线程安全保护,但它们通常涉及 太多了 对队列进行昂贵的锁定和解锁,这可能是您所有时间的目的地。

        2
  •  15
  •   bish    15 年前

    杰伊P。是的:

    ~$ strace -c ./threads.pl
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     99.80    0.116007       10546        11           futex
      0.20    0.000229           6        36           mmap2
      0.00    0.000000           0        31           read
      0.00    0.000000           0        49        13 open
      0.00    0.000000           0        36           close
    

    ~$ strace -c ./no-threads.pl
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     90.62    0.000261         261         1           execve
      9.38    0.000027           0       167           write
      0.00    0.000000           0        12           read
      0.00    0.000000           0        38        13 open
      0.00    0.000000           0        25           close
    
        3
  •  7
  •   noctonura    15 年前

    如果您有2个进程,我敢打赌一个有2个线程的版本可能是最快的,4个进程->使用4个线程等。

        4
  •  2
  •   tsee    15 年前

    这有点病态。真正的答案是:在开始使用PerlIthreads之前,您需要了解一些事情是如何工作的。众所周知,他们在某些方面效率低下(共享数据),而在其他方面则表现出色(它们是并行的)。

    与像Jay P这样的Python线程相比:正如他正确指出的那样,Python线程是协作的,只在一个核心上运行。Perl的读取非常不同。每个线程都可以在一个内核上运行,但要做到这一点,基本上每个线程都有一个单独的解释器。这使得线程之间的通信类似于进程间通信,包括相关的开销。