私はここに私の仕事のために非常に遅いが働く機能(それは10〜100倍高速である必要があります)このコードを高速化するにはどうすればよいですか?
を持っているコード
List<string[]> sequences
は、単語の配列の配列です
public long Support(List<string[]> sequences, string[] words)
{
var count = 0;
foreach (var sequence in sequences)
{
for (int i = 0; i < sequence.Length - words.Length + 1; i++)
{
bool foundSeq = true;
for (int j = 0; j < words.Length; j++)
{
foundSeq = foundSeq && sequence[i + j] == words[j];
}
if (foundSeq)
{
count++;
break;
}
}
}
return count;
}
public void Support(List<string[]> sequences, List<SequenceInfo> sequenceInfoCollection)
{
System.Threading.Tasks.Parallel.ForEach(sequenceInfoCollection.Where(x => x.Support==null),sequenceInfo =>
{
sequenceInfo.Support = Support(sequences, sequenceInfo.Sequence);
});
}
です。この配列は、通常250k +の行を含んでいます。各行は約4-7語です。 string[] words
は、カウントしようとしている単語の配列です(すべての単語が少なくとも1回は連続しています)。
問題はfoundSeq = foundSeq && sequence[i + j] == words[j];
です。このコードは、すべての実行時間の大部分を占めます(Enumerable.MoveNextが2位)。私は配列内のすべての単語をハッシュしたい。数字は文字列よりも速く比較されます。私はそれが性能の30%〜80%を得るのを助けることができると思う。しかし、私は10倍が必要です!私は何ができますか?それがaprioryアルゴリズムの一部であることを知りたければ。
サポート機能チェックの単語シーケンスは、シーケンスのリスト内の任意の順序一部であり、どのくらいの時間をカウントします。
適切な言語タグを付けてください。 – Mat
解決しようとしている問題の説明を*コードの上に移動することをお勧めします。 –
@Hosam Alyは単語数(string [] words)を順番に並べる(リストシーケンス) –
Neir0