论坛首页 编程语言技术论坛

ruby线程运行速度测试

浏览 16980 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-02  
ruby的线程都不能说是伪线程,应该说假线程,你跑10个线程其实就是10个任务在串行排队执行。
0 请登录后投票
   发表时间:2006-11-03  
这个测试远远远远远远偏离了初衷...

C++是编译到直接在CPU上跑的机器码的,Ruby是需要一边解释一边执行的。这个测试看到的性能差异是这个不同导致的性能差异。

从理论上说,单(核)CPU上伪线程和native线程在性能上的差异应该是很小的,甚至伪线程的性能可能更高(依赖于实现)。伪线程在性能上的劣势只有在多核多CPU上才会显现出来。

要想比较伪线程和native线程的性能差异,可以这样做:

1)把程序改成单线程,可能需要加大C++的运算量,测出Ruby vs. C++的性能。假设这个性能比是1:n。

2)把程序改回多线程,测试Ruby vs. C++的性能。假设这个性能比是1:m。

3)比较m和n
0 请登录后投票
   发表时间:2006-11-03  
robbin 写道
ruby的线程都不能说是伪线程,应该说假线程,你跑10个线程其实就是10个任务在串行排队执行。

伪线程和任务都是术语,不好乱说的,容易让人误会。
而且,ruby的10个线程也不是“串行排队”,和native线程一样是分时的。
0 请登录后投票
   发表时间:2006-11-03  
又一个非常小的疑问。
为什么每次执行,最后打印的那个count都是不一样的。
按理说,如果都是串行排队的,都应该是49999500000
难道ruby的green线程调度中,+=不是原子操作?
我用python写了一个类似的脚本,每次执行的最终结果都是一样的(当然每个线程的count结果每次都不一样),耗时大概是ruby脚本的1/7
0 请登录后投票
   发表时间:2006-11-03  
aardvark 写道
这个测试远远远远远远偏离了初衷...

C++是编译到直接在CPU上跑的机器码的,Ruby是需要一边解释一边执行的。这个测试看到的性能差异是这个不同导致的性能差异。

从理论上说,单(核)CPU上伪线程和native线程在性能上的差异应该是很小的,甚至伪线程的性能可能更高(依赖于实现)。伪线程在性能上的劣势只有在多核多CPU上才会显现出来。

要想比较伪线程和native线程的性能差异,可以这样做:

1)把程序改成单线程,可能需要加大C++的运算量,测出Ruby vs. C++的性能。假设这个性能比是1:n。

2)把程序改回多线程,测试Ruby vs. C++的性能。假设这个性能比是1:m。

3)比较m和n



按你这个方法测试了下,改成10000000次累加,另外ruby运行速度实在太慢,不在循环测试10次求平均
单位是毫秒

第一项是 45645:32
第二项是 439000:469
n:m的结果 0.656



0 请登录后投票
   发表时间:2006-11-03  
charon 写道
又一个非常小的疑问。
为什么每次执行,最后打印的那个count都是不一样的。
按理说,如果都是串行排队的,都应该是49999500000
难道ruby的green线程调度中,+=不是原子操作?
我用python写了一个类似的脚本,每次执行的最终结果都是一样的(当然每个线程的count结果每次都不一样),耗时大概是ruby脚本的1/7


对哦,我的输出结果,这个的确奇怪.

Fri Nov 03 09:40:15 -0800 2006
count = 6639792732
3.547
Fri Nov 03 09:40:18 -0800 2006
count = 6713860038
3.828
Fri Nov 03 09:40:22 -0800 2006
count = 6474941112
3.359
Fri Nov 03 09:40:26 -0800 2006
count = 6540511590
2.766
Fri Nov 03 09:40:28 -0800 2006
count = 6543815896
2.734
Fri Nov 03 09:40:31 -0800 2006
count = 6660264966
2.766
Fri Nov 03 09:40:34 -0800 2006
count = 6553154092
2.922
Fri Nov 03 09:40:37 -0800 2006
count = 6630718756
2.765
Fri Nov 03 09:40:40 -0800 2006
count = 6582592512
2.797
Fri Nov 03 09:40:42 -0800 2006
count = 6523668315
2.781
30.265

如果只运行一次,每次10个线程累加 结果都是count = 6639792732

估计是溢出了,这里是10个线程都累加到一个count上,如果每一个thread都有自己的count,累加下来就是49999500000没错的.
0 请登录后投票
   发表时间:2006-11-03  
应该不会溢出吧?

0 请登录后投票
   发表时间:2006-11-03  
charon 写道
又一个非常小的疑问。
为什么每次执行,最后打印的那个count都是不一样的。
按理说,如果都是串行排队的,都应该是49999500000
难道ruby的green线程调度中,+=不是原子操作?
我用python写了一个类似的脚本,每次执行的最终结果都是一样的(当然每个线程的count结果每次都不一样),耗时大概是ruby脚本的1/7


+= 在Java里也不是原子操作的, 需要对外部资源进行显式的synchronization.

不过既然是伪线程, 解释器去负责调度的, 按说应该比较容易实现成原子操作的.

不知道Ruby里有没有类似Java的 synchronized(obj) { ... }  这种机制?
0 请登录后投票
   发表时间:2006-11-03  
哪位解释一下为什么我的输出是0.16
我机器又没这么强悍 :-P
0 请登录后投票
   发表时间:2006-11-03  
whisper 写道
哪位解释一下为什么我的输出是0.16
我机器又没这么强悍 :-P

那段ruby代码的结果是0.16?夸张了点。你的环境是什么样子的?
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics