MRI ruby线程和性能

MRI ruby线程和性能,ruby,multithreading,mri,Ruby,Multithreading,Mri,我的第一个问题是这样的,但是我已经潜伏了很长时间,所以如果我违反了任何规则或者发布了一个垃圾问题,你必须原谅我 我试图更好地理解线程,我决定测试MRI,看看它的性能如何 给定以下代码(和输出),为什么线程操作比非线程变体慢得多 代码 提前感谢。一旦遇到大量线程(5000个),调度程序在线程之间切换的开销将远远超过每个线程实际完成的工作量。通常,您最多需要30-50个线程 尝试降低线程数量,并按比例增加每个线程的工作量: 20.times.map do Thread.new do

我的第一个问题是这样的,但是我已经潜伏了很长时间,所以如果我违反了任何规则或者发布了一个垃圾问题,你必须原谅我

我试图更好地理解线程,我决定测试MRI,看看它的性能如何

给定以下代码(和输出),为什么线程操作比非线程变体慢得多

代码
提前感谢。

一旦遇到大量线程(5000个),调度程序在线程之间切换的开销将远远超过每个线程实际完成的工作量。通常,您最多需要30-50个线程

尝试降低线程数量,并按比例增加每个线程的工作量:

  20.times.map do
    Thread.new do
      250000.times do
        array << nil
      end
    end
  end.each(&:join)
20.times.map do
新做的
25万倍

数组=时间(非线程)
-即线程版本的时间不能低于单线程版本。这是因为MRI的GIL一次只允许执行一个线程(它们永远不能并行运行)。一些ruby实现,如JRuby,允许并行执行线程。

感谢Martin,刚刚重新测试,发现结果确实更具可比性。标记为已回答。
Benchmark 1 (threaded, mutex):
----------Benchmark Start----------
5000000
Operation Took: 3.373886 seconds
----------Benchmark End------------
Benchmark 2 (threaded, no mutex):
----------Benchmark Start----------
5000000
Operation Took: 5.040501 seconds
----------Benchmark End------------
Benchmark 3 (no threads):
----------Benchmark Start----------
5000000
Operation Took: 0.454665 seconds
----------Benchmark End------------
  20.times.map do
    Thread.new do
      250000.times do
        array << nil
      end
    end
  end.each(&:join)