Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Но ты не забывай что GC не требуется проходи по списку на каждое выделение-освобождение.
E>Это никому не требуется, кроме древних-предревних кучь...
Ну давайте чтобы не быть голословным приведу код:
На c++
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD ticks = GetTickCount();
for(int i=0; i<1000000; i++)
{
int* arr = new int[64];
delete [] arr;
}
printf("%d", GetTickCount() - ticks);
getchar();
return 0;
}
На C#
static void Main(string[] args)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
var arr = new int[64];
arr[0] = arr[1]; //иначе оптимизатор грохает цикл
}
GC.Collect();//чтобы быть уверенным что вся память освободилась
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadKey();
}
Собиралось 2008 студией, релиз, запуск из проводника.
C++ — 562 мсек, C# — 92 мсек.
Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.