我有一个功能对我的任务来说非常慢(它必须快 10-100 倍)
这是代码
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);
});
}
whereList<string[]> sequences
是一个单词数组。该数组通常包含 250k+ 行。每行大约4-7个单词。 string[] words
是我们试图计算的单词数组(所有单词至少包含一次序列)。
问题是foundSeq = foundSeq && sequence[i + j] == words[j];
。此代码占用大部分执行时间(Enumerable.MoveNext 排在第二位)。我想对数组中的所有单词进行哈希处理。数字比字符串更快,对吧?我认为它可以帮助我获得 30%-80% 的性能。但我需要10倍!我能做什么?如果你想知道它是先验算法的一部分。
Support function check if the words sequence is a part any sequence in the sequences list and count how much times.