为什么主机系统上的lua比linux vm慢?

时间:2014-08-20 17:22:27

标签: c linux macos lua clang

将Macbook Air上的this Lua Script(Mac OS 10.9.4,i5-4250U(1.3GHz),8GB RAM)的执行时间与运行Arch Linux的VM(虚拟机)进行比较。

在Arch Linux虚拟箱中编译Lua 5.2.3

首先,我自己使用clang编译lua,将其与Mac OS X clang二进制文件进行比较。

使用tcc,gcc和clang

$ tcc *[^ca].c lgc.c lfunc.c lua.c -lm -o luatcc
$ gcc -O3 *[^ca].c lgc.c lfunc.c lua.c -lm -o luagcc
/tmp/ccxAEYH8.o: In function `os_tmpname':
loslib.c:(.text+0x29c): warning: the use of `tmpnam' is dangerous, better use `mkstemp'
$ clang -O3 *[^ca].c lgc.c lfunc.c lua.c -lm -o luaclang
/tmp/loslib-bd4ef4.o:loslib.c:function os_tmpname: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
VM中的clang版本
$ clang --version
clang version 3.4.2 (tags/RELEASE_34/dot2-final)
Target: x86_64-unknown-linux-gnu
Thread model: posix

比较文件大小

$ ls -lh |grep lua
-rwxr-xr-x 1 markus markus 210K 20. Aug 18:21 luaclang
-rwxr-xr-x 1 markus markus 251K 20. Aug 18:22 luagcc
-rwxr-xr-x 1 markus markus 287K 20. Aug 18:22 luatcc

VM基准测试

clang binary~3.1 sec

$ time ./luaclang sumdata.lua data.log
Original Size: 117261680 kb
Compressed Size: 96727557 kb
real    0m3.124s
user    0m3.100s
sys  0m0.020s

gcc二进制~3.09秒

$ time ./luagcc sumdata.lua data.log
Original Size: 117261680 kb
Compressed Size: 96727557 kb
real    0m3.090s
user    0m3.080s
sys 0m0.007s

tcc binary~7.0秒 - 这里不足为奇:)

$ time ./luatcc sumdata.lua data.log
Original Size: 117261680 kb
Compressed Size: 96727557 kb
real    0m7.071s
user    0m7.053s
sys 0m0.010s

在Mac OS X上编译

现在使用与VM中相同的clang命令/选项编译lua。

$ clang -O3 *[^ca].c lgc.c lfunc.c lua.c -lm -o luaclangmac
loslib.c:108:3: warning: 'tmpnam' is deprecated: This function is provided for
compatibility reasons only. Due to security concerns inherent in the design of tmpnam(3),
it is highly recommended that you use mkstemp(3)
instead. [-Wdeprecated-declarations]
lua_tmpnam(buff, err);
^
loslib.c:57:33: note: expanded from macro 'lua_tmpnam'
#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); }
^
/usr/include/stdio.h:274:7: note: 'tmpnam' declared here
char *tmpnam(char *);
^
1 warning generated.
铿锵版Mac OS X.

我试过两个版本。 3.4.2和xcode提供的那个。版本3.4.2有点慢。

Markuss-MacBook-Air:bin markus$ ./clang --version
clang version 3.4.2 (tags/RELEASE_34/dot2-rc1)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
Markuss-MacBook-Air:bin markus$ clang --version
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

文件大小

$ ls -lh|grep lua
-rwxr-xr-x 1 markus staff 194K 20 Aug 18:26 luaclangmac

HOST基准测试

clang binary~4.3 sec

$ time ./luaclangmac sumdata.lua data.log
Original Size: 117261680 kb
Compressed Size: 96727557 kb
real    0m4.338s
user    0m4.264s
sys 0m0.062s

为什么?

我原本期望主机系统比虚拟化(或大致相同的速度)快一点。但并不是主机系统的重复性较慢。

那么,有什么想法或解释吗?

更新2014.10.30

与此同时,我已经在我的MBA上安装了Arch Linux。基准测试与Arch Linux VM一样快。

3 个答案:

答案 0 :(得分:1)

您可以尝试运行'perf stat'而不是'time'。它为您提供了更多细节,时间测量更加正确,避免了VM内部的时序差异。

以下是一个例子:

$ perf stat ls > /dev/null

'ls'的性能计数器统计信息:

     23.348076      task-clock (msec)         #    0.989 CPUs utilized          
             2      context-switches          #    0.086 K/sec                  
             0      cpu-migrations            #    0.000 K/sec                  
            93      page-faults               #    0.004 M/sec                  
    74,628,308      cycles                    #    3.196 GHz                     [65.75%]
       740,755      stalled-cycles-frontend   #    0.99% frontend cycles idle    [48.66%]
    29,200,738      stalled-cycles-backend    #   39.13% backend  cycles idle    [60.02%]
    80,592,001      instructions              #    1.08  insns per cycle        
                                              #    0.36  stalled cycles per insn
    17,746,633      branches                  #  760.090 M/sec                   [60.00%]
       642,360      branch-misses             #    3.62% of all branches         [48.64%]

   0.023609439 seconds time elapsed

答案 1 :(得分:0)

我的猜测是HFS +日记功能正在增加延迟。这很容易测试:如果TimeMachine在Macbook Air上运行,你可以尝试禁用它,并禁用文件系统上的日记功能(显然你应该先备份)。以root身份:

diskutil disableJournal YourDiskVolume

我会看是否是问题的原因。然后我会立即重新启用日记功能。

diskutil enableJournal YourDiskVolume

OS X 10.9.2有一个与日志相关的错误会导致文件系统挂起...... this page会进一步探讨这个错误,即使错误(#15821723)没有被报告为已修复,也可能是日志错误据报道,不再崩溃磁盘控制器。

答案 2 :(得分:0)

测试lua的速度,而不是读取文件将一些示例数据硬编码到测试脚本中,并根据需要一遍又一遍地循环。与其他提到的一样,文件系统效果将超过任何编译器差异。