takusi 曰く,"develより。LinuxとWindowsにおけるメモリー・コピーの性能の違いを測定したものです。下のほうにMS-Excelのグラフがあるのですが、Linuxが特に面白いグラフになっています。もしかしたら測定の方法に問題があったのかもしれません。皆さんのPCでの結果を、是非、教えてください。"ハードウェアの機能をうまく使っているからこそ、揺らぎが出るとは面白い。
素朴な疑問だが (スコア:3, 参考になる)
MBオーダのメモリのコピーが欲しい場合、mmap(2)で別のアドレス空間に見かけ上コピーする(必要ならばMAP_PRIVATEでcopy-on-writeを併用)方がずっと速そうだし、ページの節約もできると考えてしまうのは私だけだろうか?
Re:素朴な疑問だが (スコア:2, 参考になる)
おまけで (スコア:2, 参考になる)
mallocでとる領域は、常にその処理系で扱う最大bit長をもつ基本データ型と同じアライン値にする場合が多いので、ミスアラインに気づかないこともあったり。昔のわたしがそうでした。ハイ。
Re:要するに (スコア:2, 参考になる)
もしそれを狙ったコーディングなら、ちとセンスが古いような気がします。
Mc.N
素朴な疑問、もう一つ (スコア:1)
#gccの正式リリースではなく、RedHatが無理に組み込んだ開発版。
そこまでは気づけなかったのかなぁ・・・まぁ、これは
RedHatを選択したのがまずかったですね。
従って、これはRedHat7.0とWin2kでの比較記事ですね。
#前よかちょっとはマシになってるものの、相変わらず
#詰めが甘いようですな・・・残念なことに(汗)。
---- redbrick
要するに (スコア:1)
memcpyは約1kbyte程度を越えるあたりからなら他の方法より速い(場合が多い)
という、当然と言うかあたりまえというか予測可能な結論が出ただけのような気もする。
まぁ、memcpyなんかでバラ付きが出るってのはちょっと面白いけどね。
だけど、いくら速いからと言っても
char buffer_from[1024], buffer_to[1024];
double *sptr = (double*)buffer_from, *dptr = (double*)buffer_to;
int count;
for(count=0; count<128; count++) {
*dptr++ = *sptr++;
}
とかってcharのものをdouble*でコピーするなんてのはマトモな神経ではないような気が...
今時のCPUの速度とか考えれば、やっぱり微妙な速度差よりはソースの読みやすさを優先すべきだと思うけどなぁ
私的には、
Re:要するに (スコア:1)
多少、オフトビかと思います。私も、殆どのケースで、メモリ・コピーはmemcpyで十分だし、自分でmemcpyを使わないでメモリ・コピーをする必要はないと思います。
今回のトピックは、コピーの方法によって、どのような速度の違いがでるのか、OSやコンパイラの違いによって、どのような違いがでるのか、という話だと思います。
rm -rf /bin/laden
Re:要するに (スコア:1)
ライブラリも使わんと、一バイト、二バイト、四バイト、八バイト転送をこれだけでやってるヤツをクビにしたことあります (^^;
特に double * なんてのは、途中に正規化補正その他の変換命令が出てしまったとしても、コンパイラにはモンクいえませんです。はい。
みんつ
Re:素朴な疑問、もう一つ (スコア:1)
両方ともIntelコンパイラ使ったらどうなんでしょうね?
BURRN!
Re:素朴な疑問だが (スコア:1)
そもそも今回の目的は Windows と Linux の source が同じであることに意味があるらしいので敢えて CRT を使っているのではないかと。
興味深いのですが参考になるかと言われると、、、どうなんでしょうか?
Mc.N
Re:素朴な疑問、もう一つ (スコア:1)
後、Win32でもcygwin使ってどちらもgccベースで試すとか面白そうですよね。
#しかし、大元の記事読んだら、これって前のpipeのものより
#前の記事でやんの(汗)。
#pipeの記事は思いっ切り手抜きだったんだな・・・。
---- redbrick
Re:素朴な疑問だが (スコア:1)
複製したデータの塊から加工したデータを同じ領域に書き換える場合とか、却ってメモ リ効率が悪くなる場合もある。
つまりは、mmap(2)的な手法が使えない場合ってのは結構多いのではないかと思うので すが。
Re:要するに (スコア:1)
でこぼこが出るのはループ最適化でよくあるプロローグとエピローグの影響ってことで。
機械語レベルで考えると、複数の命令でできたループを回すよりもストリング命令ひとつの方がだいぶ速かったってことですよね。 逆にいうと、よくチューンされたmemcpy関数はだからストリング命令を使ってると。
コンパイラレベルでは、ループを認識してストリング命令まで落とし込んでくれるようなやつがまだいない、と。