授業のネタとするために、型によって計算時間がどう変化するか実験。レガシーなコンピュータを使ってきた人間には、float とか double とか出てきたら、「Z80な時代の頭」では数倍遅いのを期待したけど、FPU を搭載して当たり前のこの時代、そんなに差は出ない。
FPUという言葉さえ、最近は死語かな…
しかたがないので、macOS , Raspberry-Pi , Arduino 遅さの時代を逆行しながら実験。
// test.cxx #ifndef TYPE #define TYPE int #endif #include <stdio.h> TYPE foo( TYPE i ) { TYPE ans = 0 ; for( int j = 0 ; j < 30000 ; j++ ) { ans += i * i ; } return ans ; } int main() { TYPE y = 0 ; for( TYPE i = 0 ; i < 100000 ; i++ ) { y = foo( i ) ; } return 0 ; }
iMac で実験
iMac で実験。デスクトップ 64 bit マシンだし、そんなに差は出ないのは予想どおり。
bash-3.2$ uname -a Darwin imac2 17.4.0 Darwin Kernel Version 17.4.0: ... root:xnu-4570.41.2~1/RELEASE_X86_64 x86_64 bash-3.2$ g++ -O0 -DTYPE=int test.cxx bash-3.2$ time ./a.out user 0m6.857s bash-3.2$ g++ -O0 -DTYPE="long long int" test.cxx bash-3.2$ time ./a.out user 0m6.831s bash-3.2$ g++ -O0 -DTYPE=float test.cxx bash-3.2$ time ./a.out user 0m8.528s bash-3.2$ g++ -O0 -DTYPE=double test.cxx bash-3.2$ time ./a.out user 0m8.615s
Raspberry-Pi3 で実験
組み込み系の FPU などが貧弱なマシンを想定し、Raspberry-Pi 3 で同じことをやってみた。
64bit整数 long long int が想定外に遅いな。
raspberry-pi:~$ uname -a Linux raspberry-pi 4.14.22-v7+ #1096 SMP ...2018 armv7l GNU/Linux raspberry-pi:~$ gcc -O0 -DTYPE=int test.cxx raspberry-pi:~$ time ./a.out user 0m37.588s raspberry-pi:~$ gcc -O0 -DTYPE="long long int" test.cxx raspberry-pi:~$ time ./a.out user 1m18.535s raspberry-pi:~$ gcc -O0 -DTYPE=float test.cxx raspberry-pi:~$ time ./a.out user 0m52.206s raspberry-pi:~$ gcc -O0 -DTYPE=double test.cxx raspberry-pi:~$ time ./a.out user 0m50.287s
Arduino で実験
同じことを Arduino でやってみた。main のループは 1/10000 の回数にして、10000倍の時間を掲載…
ようやく「Z80 な頭」が期待している実験結果となったかな。
int 6880[sec] 16bit int long 6320[sec] 32bit int float 92080[sec] 32bit float double 92080[sec] Arduino Uno では、double = 32bit で float と同じ