锁定老帖子 主题:ruby线程运行速度测试
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-02
ruby的线程都不能说是伪线程,应该说假线程,你跑10个线程其实就是10个任务在串行排队执行。
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2006-11-03
robbin 写道 ruby的线程都不能说是伪线程,应该说假线程,你跑10个线程其实就是10个任务在串行排队执行。
伪线程和任务都是术语,不好乱说的,容易让人误会。 而且,ruby的10个线程也不是“串行排队”,和native线程一样是分时的。 |
|
返回顶楼 | |
发表时间:2006-11-03
又一个非常小的疑问。
为什么每次执行,最后打印的那个count都是不一样的。 按理说,如果都是串行排队的,都应该是49999500000 难道ruby的green线程调度中,+=不是原子操作? 我用python写了一个类似的脚本,每次执行的最终结果都是一样的(当然每个线程的count结果每次都不一样),耗时大概是ruby脚本的1/7 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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没错的. |
|
返回顶楼 | |
发表时间:2006-11-03
应该不会溢出吧?
|
|
返回顶楼 | |
发表时间:2006-11-03
charon 写道 又一个非常小的疑问。
为什么每次执行,最后打印的那个count都是不一样的。 按理说,如果都是串行排队的,都应该是49999500000 难道ruby的green线程调度中,+=不是原子操作? 我用python写了一个类似的脚本,每次执行的最终结果都是一样的(当然每个线程的count结果每次都不一样),耗时大概是ruby脚本的1/7 += 在Java里也不是原子操作的, 需要对外部资源进行显式的synchronization. 不过既然是伪线程, 解释器去负责调度的, 按说应该比较容易实现成原子操作的. 不知道Ruby里有没有类似Java的 synchronized(obj) { ... } 这种机制? |
|
返回顶楼 | |
发表时间:2006-11-03
哪位解释一下为什么我的输出是0.16
我机器又没这么强悍 :-P |
|
返回顶楼 | |
发表时间:2006-11-03
whisper 写道 哪位解释一下为什么我的输出是0.16
我机器又没这么强悍 :-P 那段ruby代码的结果是0.16?夸张了点。你的环境是什么样子的? |
|
返回顶楼 | |