3

iOS7.0以降の空でないNSStringをテストするのにどれが最速か知りたいのですが。
注:テストする文字列は、2〜100文字の長さの99%の時間になります。

if ([foo length] > 0)

また

if ([foo isEqualToString:@""] == NO && foo != nil)

長さを最初に比較するかisEqualToString:(その場合は最初の方法の方が速い)isEqualToString:、文字列の最初の文字を最初に比較するか(その場合は2番目の方法の方が速いかもしれません)によって異なります。

ps:私はすでにそれ自体がよりisEqualToString:も速いことを知っています。isEqual:compare:

4

2 に答える 2

4

それを測定して見てください。

真剣に。これが実際にパフォーマンスのボトルネックであることがわかる場合を除いて、このようなものを最適化するべきではありません(これはほとんどあり得ません)。計測器(タイムプロファイラーを使用)がそれが問題であると言っている場合、正しいアプローチはあなたの仮定を測定することです。

n百万のランダムな文字列を生成し、オプションA、オプションBの順にコードの時間を計り、最速を選択します。

于 2012-08-30T08:39:25.333 に答える
2

長さをテストするだけで、数倍速くなります(テストしたシステムで)。

もちろん、フレームワークの実装に依存しています。

読みやすさを向上させる可能性のある関数を検討するかもしれません。「高速な方法」が変更された場合、変更する行は2行だけになります。


以下のコメントで、私は定数/特異/一意の文字列を使用することが比較のために最速であることを提案しました。

  • 72秒isEqualToString:のみ
  • 22.6sは常にテストしますlength
  • 15.6sポインター比較、それ以外の場合はテストlength(テストの半分の要素は定数に一致)。これは、コレクションの空の文字列の一部が定数である場合に適用されますが、そうでないものもあります。コレクション内の定数の分布に基づいて変化する可能性があります。
  • 4.6ポインタ比較のみ

ポインター比較の使用は、長さのテストより5倍高速で、。より15.7倍高速ですisEqualToString:。もちろん、すべての空の文字列が定数になるように、配列を作成するときにオーバーヘッドを追加する必要がある場合があります。

于 2012-08-30T09:02:34.887 に答える