Медленный вызов 64-битного метода C # - PullRequest
0 голосов
/ 23 августа 2011

Привет, у меня 32-битное приложение, портированное на 64-битный. Как-то вызовы методов 64-битного намного медленнее, чем 32-битный.

пример кода

    class huge_class
{
 class subclass0{}
 class subclass1{}
 class subclass2{}
 class subclass3{}
 class subclass4{}
 class subclass5{}
 class subclass6{}
 class subclass7{}
 //so on... say 300

 private object[] GetClassObj(Stopwatch x)
 {
       Console.WriteLine(x.ElapsedMilliseconds.ToString()); //<- the latency can be observed here, the time it takes to execute this line takes a big amount of time
       object[] retObj = new object[300];
       retObj[0] = new subclass0();
       retObj[1] = new subclass1();
       retObj[2] = new subclass2();
       retObj[3] = new subclass3();
       retObj[4] = new subclass4();
       retObj[5] = new subclass5();
       retObj[6] = new subclass6();
            //so on... to 299
 }
}

    Class CallingClass{
  static void Main(string[] args)
    {


        Console.WriteLine("Ready");
        Console.ReadKey();
        huge_class bigClass = new huge_class();
        Console.WriteLine("Init Done");
        Console.ReadKey();
        Stopwatch tmr = Stopwatch.StartNew();
        object[] WholeLottaObj = bigClass.GetClassObj(tmr);
        Console.WriteLine(tmr.ElapsedMilliseconds.ToString());
        Console.WriteLine("Done");
        Console.ReadKey();
}

по какой-то странной причине на 32-битном GetClassObjвводится быстрее, чем на его 64-битной версии, что я делаю не так

Ответы [ 2 ]

6 голосов
/ 23 августа 2011

Это может быть связано с когерентностью кэша.Не забывайте, что каждая ссылка будет в два раза больше на 64-битной машине, чем на 32-битной.Это означает:

  • Каждый из ваших объектов экземпляра будет больше, поэтому они будут распределяться дальше в памяти (в любом случае в x64 будет больше накладных расходов на объект, и любые ссылочные поля будутв два раза больше)
  • Размер самого массива будет примерно вдвое больше

Теперь вполне может оказаться, что в 32-разрядной среде CLR вы находитесь в одном из самых быстрых кэшей наваш процессор - тогда как в 64-битном CLR вы вышли за его пределы, поэтому ему приходится переставлять память в этот кеш или из него, либо в другой кеш, либо в основную память.

Именно поэтому по умолчанию x86для исполняемых проектов в VS2010 (и, возможно, 2008; не уверен). Этот пост в блоге более подробно описан.

1 голос
/ 23 августа 2011

Почему это должно быть быстрее, в первую очередь? Операции с 64-битными указателями в два раза тяжелее (с точки зрения памяти), поэтому для 64-битных приложений естественно медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...