web-dev-qa-db-ja.com

memcpy()は通常strcpy()より高速ですか?

memcpy()は通常strcpy()よりも高速ですか(ほとんどの実際のプラットフォーム)。 (文字列のサイズはわかっていると思います。)

私がi386アセンブラを正しく覚えている場合、特定のバイト数またはワード数をコピーするloop命令があります。したがって、これが最速の方法ですが、strcpy() i386アセンブラ実装は、プレーンループで_'\0'_の手動チェックを使用します。

だから私はx86ではmemcpy()strcpy()より速いと感じています。

他のアーキテクチャはどうですか?

18
porton

コピーするデータのサイズがわかっている場合、memcpy()strcpy()と同じかそれより高速である必要があります。それ以外の場合、memcpy()を単独で使用することはできません。strcpy()は、strlen()の後にmemcpy()を指定した場合と同じかそれよりも高速である必要があります。

しかしながら...

memcpy()strcpy()strlen()の多くの実装は、大量のデータを効率的に処理するように設計されています。これは、多くの場合、追加の起動オーバーヘッド(アライメントの決定、SIMDの設定、キャッシュ管理など)を意味し、これらの実装を少量のデータのコピーに適さない(低速)にします(適切に記述されたコードでははるかに可能性が高い)。このため、「高速または高速である必要があります」が必ずしも「高速または高速である」を意味するわけではありません。たとえば、少量のデータの場合、大量のデータ用に最適化されたmemcpy()は、大量のデータ用に最適化されなかったstrcpy()よりも大幅に遅くなる可能性があります。

また、ここでの主な問題は、一般的なコード(memcpy()strcpy()など)が特定のケースに対して最適化できないことです。最良の解決策は、複数の機能を持つことでした-例えばmemcpy_small()は少量のデータのコピー用に最適化されており、memcpy_large()は失敗した不良コード用に最適化されており、大量のデータのコピーを回避します。

23
Brendan

ほとんどすべてのプラットフォームで、同じバイト数をコピーする場合、memcpy()strcpy()よりも高速になります。 strcpy()またはその「安全な」同等物がmemcpy()よりも優れているのは、文字列の最大許容サイズが実際のサイズよりはるかに大きい場合のみです。 100万文字までの文字列を保持できるバッファがあり、その文字列を別の100万バイトのバッファにコピーする場合、memcpy()は、たとえ文字列が最初のバッファの長さは2文字だけでした。ただし、strcpy()関数または同等の関数は、早期に終了することができ、2つの文字をコピーするのにかかる時間は、memcpy()が100万をコピーするのに必要な時間よりも短いでしょう。

10
supercat