3

たとえば、次のように、CSV文字列のリストとして、ユーザーID、アクセス時間、プログラム名、およびバージョン番号のリストがあるとします。

1,1342995305,Some Program,0.98
1,1342995315,Some Program,1.20
2,1342985305,Another Program,15.8.3
1,1342995443,Bob's favorite game,0.98
3,1238543846,Something else,
...

このリストはファイルではなく、文字列のメモリ内リストであると想定します。

ここで、特定のプログラムがバージョン番号でリストされている頻度で、そのプログラムにアクセスした頻度を調べたいとしましょう。(例:「一部のプログラムバージョン1.20」は193回アクセスされ、「一部のプログラムバージョン0.98」は876回アクセスされ、「一部のプログラム1.0.1」は1,932回アクセスされました)

正規表現を作成してregexec()から、一致するものを見つけてバージョン番号を引き出すために使用するかstrstr()、プログラム名とコンマを一致させてから、文字列の次の部分をバージョン番号として読み取る方がよいでしょうか。違いが生じる場合は、LinuxでGCCを使用していると想定してください。

パフォーマンスに違いはありますか?一方の方法は、もう一方の方法よりも「優れている」または「より適切」ですか?それはまったく重要ですか?

4

4 に答える 4

3

とにかくstrstr()-正規表現を使用して発生数をカウントすることは、とにかくループを使用する必要があるため、お勧めできません。したがって、部分文字列の位置を検索し、カウンターを増やして検索位置を開始するという単純なループを実行することをお勧めします。各試合。

于 2012-07-22T23:00:37.997 に答える
1

strchr / memcmpは、ほとんどのlibcバージョンがstrstrを実装する方法です。glibcでのstrstrのハードウェア依存の実装の方が優れています。SSE2とSSE4.2(x86)の両方の命令セットは、バイトごとにスキャンするよりもはるかに優れています。その方法を知りたい場合は、しばらく前にいくつかのブログ記事を投稿しました--- SSE2とstrstr およびSSE2とBNDM検索---おもしろいと思うかもしれません。

于 2012-07-30T21:21:54.073 に答える
0

strtok()、およびデータをより構造化されたもの(構造体のリストなど)に分割します。

于 2012-07-22T23:02:46.430 に答える
0

私はどちらもしません。strchr()コンマを見つけstrcmp()たり、プログラム名を確認したりするのに使用する方が速いと思います。

パフォーマンスに関しては、文字列関数(strtok/ strstr/ strchr/ strpos/ strcmp...)はほぼ同じ速度で(つまり、本当に、本当に速く)実行され、正規表現はかなり高速ですが、かなり遅く実行されると思います。

ただし、実際のパフォーマンス上の利点は、検索を適切に設計することで得られます。検索を何回実行する必要があるか、プログラムの数は固定されていますか...?

たとえば、すべてのプログラムのすべての頻度データを取得する1回のスキャンは、特定のプログラムを検索する1回のスキャンよりもはるかに低速になります。しかし、適切に設計されていれば、他のプログラムに対する後続のすべてのクエリははるかに高速に実行されます。

于 2012-07-22T23:04:10.150 に答える