私はそれを非同期にするために何をすべきメソッドを非同期にするには?
public static LevenshteinMatches LevenshteinSingleThread(this string str, string expression, int maxDistance) {
if (str.Length > expression.Length + 1) {
int len = expression.Length;
long strLen = str.Length - len + 1;
int[] results = new int[strLen];
int[][,] dimension = new int[strLen][,];
for (int i = 0; i < strLen; i++) {
dimension[i] = new int[len + 1, len + 1];
}
string source = str;
source = source.ToUpper();
expression = expression.ToUpper();
for (int i = 0; i < strLen; i++) {
results[i] = SqueareLevenshtein(ref dimension[i], str.Substring(i, len).ToUpper(), expression, len);
}
LevenshteinMatches matches = new LevenshteinMatches();
for (int i = 0; i < strLen; i++) {
if (results[i] <= maxDistance) {
matches.addMatch(str.Substring(i, len), Math.Round((1.0 - ((double)results[i]/len)) * 100.0, 2), i, len, results[i]);
}
}
return matches;
}
else {
LevenshteinMatch match = str.LevenshteinCPU(expression, maxDistance);
if (match != null)
return new LevenshteinMatches(match);
else
return new LevenshteinMatches();
}
}
レーベンシュタイン距離を計算するための方法がありますか?
このメソッドを残して、別の方法で呼び出す必要がありますか?
ここでは非同期化しようとしています。何が間違っているのか分かりませんが、結果は得られません。スレッドは動作していますが、数ミリ秒かかるだけです。コードlink
の
public static async Task<LevenshteinMatches> LevenshteinSingleThread(this string str, string expression, int maxDistance) {
return await Task.Factory.StartNew(() => {
if (str.Length > expression.Length + 1) {
int len = expression.Length;
long strLen = str.Length - len + 1;
int[] results = new int[strLen];
int[][,] dimension = new int[strLen][,];
for (int i = 0; i < strLen; i++) {
dimension[i] = new int[len + 1, len + 1];
}
string source = str;
source = source.ToUpper();
expression = expression.ToUpper();
for (int i = 0; i < strLen; i++) {
results[i] = SqueareLevenshtein(ref dimension[i], str.Substring(i, len).ToUpper(), expression, len);
}
LevenshteinMatches matches = new LevenshteinMatches();
for (int i = 0; i < strLen; i++) {
if (results[i] <= maxDistance) {
matches.addMatch(str.Substring(i, len), Math.Round((1.0 - ((double)results[i]/len)) * 100.0, 2), i, len, results[i]);
}
}
return matches;
}
else {
LevenshteinMatch match = str.LevenshteinCPU(expression, maxDistance);
if (match != null)
return new LevenshteinMatches(match);
else
return new LevenshteinMatches();
}
});
}
残りそしてそれは、私はそれを呼び出す方法は次のとおりです。
string s = "xcjavxzcbvmrmummuuutmtumuumtryumtryumtrutryumtryumtrymutryumtyumtryumtrmutyumtrurtmutymurtmyutrymut";
s = string.Concat(Enumerable.Repeat(s, 4000));
var watch = System.Diagnostics.Stopwatch.StartNew();
var ret = s.LevenshteinSingleThread("jas", 1);
var res = ret.Result;
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
を行うことができ、スレッドセーフである場合。 '.Result'ではなく' 'ret''を待つ必要があります。 – JSteward
*メソッドを非同期にしない*。そのメソッドが行っていることについては、実際には非同期ではありません。 – Servy
あなたのコードはCPUにバインドされていて、非同期に待機しているようです。しかし、特定のホットスポットを並列化することでいくつかの利点が得られますか? – StuartLC