2013-10-25 11 views
5

私は、memmovememcpyの違いは、メモリオーバーラップの場合はmemmoveです。私はlibgccの実装をチェックして、この記事をインテルのWebサイトから[memcpy performance]にしました。どのプラットフォームでmemmoveとmemcpyのパフォーマンスに大きな違いがありますか?

libgccでは、memmovememcpyに似ていますが、どちらも1バイトと1バイトにすぎません。したがって、最適化後もパフォーマンスはほぼ同じになるはずです。

誰かがこれを測定してこの記事を手に入れました。memcopy, memmove, and Speed over Safetymemmovememcpyより速いとは思えませんが、少なくともIntelプラットフォームでは大きな違いはありません。それでは、プラットフォームとどのように、memcpy

ではなく、単にmemmoveの2似た機能を提供する理由は、何も存在しない場合、memmoveよりもかなり速くなり、バグの多くにつながることができます。

編集:私はmemmoveとmemcpyの違いを尋ねていません。私はmemmoveが重複の問題を処理できることを知っています。問題は、memcpyがmemmoveよりも速いプラットフォームが本当にあるかどうかです。

+0

私はよく覚えている場合のメモリアドレスに –

+2

質問の多くは、すでに上ありの重複に関連するいくつかの問題があります'memcpy'と' memmove'(右側の「関連する」バーを参照)。あなたの質問はまだそれらのいずれかで覆われていないと確信していますか? –

+0

標準は**インテルのプラットフォームに関する** **ではありません。 –

答えて

3

、非重複メモリの制約が高速なコードを生成するために使用される少なくとも一つの最近のケースがあります:

memmoveはできませんがmemcpyは、intrinsicsを使用してコンパイルすることができますVisual Studioで。これは、関数呼出しおよびセットアップオーバーヘッドを除去するため、既知のサイズの小領域に対しては、memcpyがはるかに高速になる。 movsd/movsw/movsbを使用した実装は、コピー中に最下位アドレスでコピーを開始し、edi/esiをインクリメントしているため、ブロックをオーバーラップするのには適していません。

Make compiler copy characters using movsdも参照してください。

GCC also lists memcpyは組み込み関数として実装されているため、実装と動機づけはVisual Studioのものと似ている可能性があります。

+0

しかし、なぜmovsd/movsw/movsbがオーバーラップコピーに適していないのですか?すべてのパラメータがわかっている場合、コンパイラはmovsdまたはmovswを選択することもできます。 – ZijingWu

+0

ok私はそれを理解しています。ほとんどの場合、ブロックサイズのみがコンパイル時定数です。 – ZijingWu

+0

movsX命令は常に最下位アドレスから開始し、コピー中にedi/esiをインクリメントして一方向に移動します。 D/W/Bはコピー単位(DWORD、WORD、BYTE)のみを選択します。 – Suma

0

良い習慣:一般的に、あなたがする必要がある場合のみ、memmoveを使用してください。ソース領域とデスティネーション領域がオーバーラップしている可能性が非常に低い場合に使用してください。

それ以外の場合はmemcpyを使用してください。 memcpyはより効率的です。

参考: https://www.youtube.com/watch?v=Yr1YnOVG-4g博士ジェリー・カイン、(スタンフォードイントロシステム講演 - 7)時間:36:00

関連する問題