128ビット整数クラス
C128 C++クラス
Athlon64X2 3800+ の SSE を利用して 128 ビットの論理演算が楽にできるのかと思ってたけど ビットシフト や AND や SUB の使い勝手がいまいち良く無い (コツを知らないだけ?)。 しょうがないので C++ で クラス C128 を作った。 一応 128 ビットリニアな Shift-L, Shift-R, ADD, SUB と AND, OR, XOR, NOT だけ実装してみました。 乗算、除算はありません。オパピ^^
以下のようなコードで、実装的に一番遅いと思われるビットシフト演算の速度を測ったところ 0.584秒/億。
void test_shift() { C128 c(1); for (long i = 0; i < 500000; i++) { for (long j = 0; j < 100; j++) c <<= 1; for (long j = 0; j < 100; j++) c >>= 1; } }
上のプログラムの C128 を 64 ビットデータ型 (unsigned long long) を使うように修正し、 オプティマイズ無しでシフト演算してみると 0.340秒/億とあまり差が無い。 消費時間の大部分はループ処理の部分と思われるのであてにならないってことか。 (測定方法が悪いんでね;;)
話は違うけど、 単純な処理をいくつか NASM やインラインアセンブラのコードで試してみてたのですが C++ で組んでオプティマイズをかける (gcc -O3) のと大差ないようです。 特殊な事情が無ければ、今は C/C++ で十分なのだろう。