Господа,
Есть следующий (сильно упрощенный код ввиду публичного рассмотрения) c# код
using System;
using System.Collections;
using System.Runtime;
namespace Hashtablebenchmark
{
class Program
{
static void Main(string[] args)
{
int n = 10000000;
for (int j=0; j<10; ++j) {
var startTime = DateTime.Now;
Hashtable hashtable = new Hashtable(n);
for (int i = 1; i <= n; ++i)
hashtable.Add(i, 1.0f / i);
Console.WriteLine("m[100] = " + hashtable[100]);
var endTime = DateTime.Now;
var time = endTime- startTime;
Console.WriteLine("Took: " + time.TotalMilliseconds / 1e3 + "s");
}
Console.ReadKey();
}
}
}
и app.config для него
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<runtime>
<gcConcurrent enabled="false"/>
<gcServer enabled="true" />
</runtime>
</configuration>
И java код (запущен с VM options
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:+AggressiveOpts)
package hashtablebenchmark;
import java.util.HashMap;
public class Hashtablebenchmark {
public static void main(String[] args) {
int n = 10000000;
for (int j=0; j<10; ++j) {
long startTime = System.currentTimeMillis();
HashMap hashtable = new HashMap(n);
for(int i=1; i<=n; ++i)
hashtable.put(i, 1.0f / i);
System.out.println("m[100] = " + hashtable.get(100));
long time = System.currentTimeMillis() - startTime;
System.out.println("Took: " + time / 1e3 + "s");
}
}
}
Результаты на одной и той же машине (win7 professional sp1 x64) следующие:
C# (собран в vs13 в release mode и запущен отдельно как console app вне студии ):
m[100] = 0.01
Took: 2.0317968s
m[100] = 0.01
Took: 3.669633s
m[100] = 0.01
Took: 2.6347365s
m[100] = 0.01
Took: 3.5336466s
m[100] = 0.01
Took: 3.6256374s
m[100] = 0.01
Took: 3.489651s
m[100] = 0.01
Took: 3.0076992s
m[100] = 0.01
Took: 3.5466453s
m[100] = 0.01
Took: 1.8048195s
m[100] = 0.01
Took: 3.1646835s
Java:
m[100] = 0.01
Took: 0.362s
m[100] = 0.01
Took: 0.376s
m[100] = 0.01
Took: 0.395s
m[100] = 0.01
Took: 0.225s
m[100] = 0.01
Took: 0.513s
m[100] = 0.01
Took: 0.22s
m[100] = 0.01
Took: 0.684s
m[100] = 0.01
Took: 0.231s
m[100] = 0.01
Took: 1.266s
m[100] = 0.01
Took: 0.241s
Как видите преимущество в производительности JVM в данном коде примерно на порядок (в 10 раз).
Что я делаю не так? Может быть где-то ошибка в коде? Если нет, то как ускорить C# код хотя бы до уровня JVM?
Надеюсь на помощь господ, умудренных опытом в C#. Спасибо