我正在对这个问题中的Haskell程序进行测量,以生成下表,其中包括运行时间和加速比概述,以便我可以在图表中绘制。
#Cores Runtimes Speedups
Absolute Relative
Seq ? .. ..
1 3.712 .. ..
2 1.646 .. ..
第一个问题
在1和2个核心上运行时,程序是通过使用-threaded
标志进行编译的(如下所示的[3]和[4]),但我不确定顺序的时间应该使用哪个(以下是[1]或[2]):
- 它应该是通过不使用
-threaded
标志进行编译获得的时间,还是 - 使用标志后获得的时间,但不指定任何核心数量,即没有
-Nx
不使用-threaded
标志进行编译
$ ghc --make -O2 test.hs
[1] $ time ./test ## number of core = 1
102334155
real 0m4.194s
user 0m0.015s
sys 0m0.046s
使用 -threaded
标志进行编译
$ ghc --make -O2 test.hs -threaded -rtsopts
[2] $ time ./test ## number of core = not sure?
102334155
real 0m3.547s
user 0m0.000s
sys 0m0.078s
[3] $ time ./test +RTS -N1 ## number of core = 1
102334155
real 0m3.712s
user 0m0.016s
sys 0m0.046s
[4] $ time ./test +RTS -N2 ## number of core = 2
102334155
real 0m1.646s
user 0m0.016s
sys 0m0.046s
第二个问题
从上面可以看出,我正在使用time
命令来测量运行时间。我正在记录“真实”时间。但如果我在程序中使用-sstderr
标志运行,我会得到更详细的信息:
$ ghc --make -O2 test.hs -rtsopts
$ ./test +RTS -sstderr
102334155
862,804 bytes allocated in the heap
2,432 bytes copied during GC
26,204 bytes maximum residency (1 sample(s))
19,716 bytes maximum slop
1 MB total memory in use (0 MB lost due to fragmentation)
Generation 0: 1 collections, 0 parallel, 0.00s, 0.00s elapsed
Generation 1: 1 collections, 0 parallel, 0.00s, 0.00s elapsed
INIT time 0.00s ( 0.00s elapsed)
MUT time 3.57s ( 3.62s elapsed)
GC time 0.00s ( 0.00s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 3.57s ( 3.62s elapsed)
%GC time 0.0% (0.0% elapsed)
Alloc rate 241,517 bytes per MUT second
Productivity 100.0% of total user, 98.6% of total elapsed
我认为
-sstderr
提供的时间更加准确,应该用它而不是 time
命令。我正确吗?另外,“Total time”(3.57秒或3.62秒)中哪个应该使用?最后,有没有关于这种测量的一般建议/最佳实践?我知道有些软件包可以让我们对程序进行基准测试,但我主要想手动进行测量(或使用脚本代替我进行测量)。
另外:运行时间是运行程序三次的中位数。