Я измеряю программу 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
. Я прав? Кроме того, какое из «Общего времени» (3,57 с или 3,62 с) следует использовать?
И, наконец, какой-нибудь общий совет/хорошая практика при выполнении подобных измерений? Я знаю, что есть некоторые пакеты, которые позволяют нам тестировать нашу программу, но меня в основном интересует измерение вручную (или использование скрипта, чтобы сделать это за меня).
Также: время выполнения - это медиана запуска программы 3 раза.