clr perf problem
От: mapnik США http://www.hooli.xyz/
Дата: 30.06.15 07:11
Оценка: -1 :)))
Господа,

Есть следующий (сильно упрощенный код ввиду публичного рассмотрения) 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#. Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.