パターン マッチのパフォーマンスに少し興味があるので、次のテストを行いました。
poolEven
0、1、2、3 の 10000 個の要素を含む (2500 個が等しい)
testSize = 100000
IfelseEven(100000)
650ミリ秒かかります(スイッチの方が高速ですが、コードを添付しませんでした)が、MatchEven(100000)
10倍の時間である7000ミリ秒かかります
パフォーマンスの低下の原因はArray.Fold
? IEnumerable.Aggregate
速度が大幅に低下することは 100% 確信しています。しかし、F#は C# よりもうまく処理できると思いArray.Fold
IEnumerable.Aggregate
ました。2 つの言語で最も一般的な (同等の) コーディング方法のパフォーマンスを比較したいが、それらを同一にする厳密な方法は比較したくない。
テストは x64 リリースで行われ、適切なウォームアップで平均 10 回以上の試行が行われます
C#:
public void IfelseEven(int testSize)
{
Ifelse(testSize, poolEven);
}
void Ifelse(int testSize, int[] pool)
{
long sum = 0;
for (int i = 0; i < testSize; i++)
{
for (int j = 0; j < poolCapacity;j++ )
{
var item = pool[j];
if (item == 0)
{
sum += 5;
}
else if (item == 1)
{
sum += 1;
}
else if (item == 2)
{
sum += 2;
}
else if (item == 3)
{
sum += 3;
}
else
{
sum += 4;
}
}
}
}
public void MatchEven(int testSize)
{
PatternMatch.myMatch(testSize, poolEven);
}
F#:
module PatternMatch
let mat acc elem =
acc +
match elem with
| 0 -> 5L
| 1 -> 1L
| 2 -> 2L
| 3 -> 3L
| _ -> 4L
let sum (pool:int[])=
Array.fold mat 0L pool;
let myMatch testSize pool=
let mutable tmp = 0L
for i=0 to testSize do
tmp <- sum(pool) + tmp
tmp