Здравствуйте, VladD2, Вы писали:
VD>Точное измерение производительности в дотнетеАвтор: VladD2
Дата: 23.04.03
Спасибо.
VD>А ты верни struct на место и все будт ОК. К тому же называть класс Object в дотнете не очень хорошая идея (это имя встроенного типа).
По условию задачи надо создать N объектов и N^2 ссылок между ними. И лишь только после создания надо натравить на эту структуру сборщик мусора и посмотреть как он с этим справится. Поскольку
struct является типом-значением, то использовать его нельзя. Для получения N^2 ссылок нужно использовать ссылочный тип, то есть нужно использовать
class.
Ваш код:
for (int i = 0; i < n; i++)
{
A a = array[i];
a.Refs = new A[n];
for (int j = 0; j < n; j++)
a.Refs[j] = array[j];
}
в том случае когда "A" есть тип-значение есть просто N^2 копирований значений объектов, а надо было создать N^2 ссылок. Так что тип "A" должен быть
class, а не
struct.
VD> Что до сравнения ЖЦ, так надо сравнивать его на реальных задачаях, а не на подобной туфте.
Во-первых, N^2 взаимных ссылок между N объектами есть максимально возможное количество (разных) взаимных ссылок. Так что этот случай есть случай с максимально возможным количеством (разных) взаимных ссылок. Любые другие случаи всегда имеют меньшее количество (разных) взаимных ссылок. Следовательно, назвать это "туфтой" уже нельзя.
Во-вторых, даже на этой, с Вашего позволения сказать "туфте", как оказалось, сборщик мусора в BlackBox работает в несколько раз (от 3.41 раза) быстрее сборщика мусора .NET:
N кол.связей один объект вся структура BlackBox .NET Отношение времен .NET/BlackBox
2000 4 млн 8 Kb 16 Mb 0.23 сек 0.83 сек 3.60 раз
3000 9 млн 12 Kb 36 Mb 0.55 сек 2.27 сек 4.13 раз
4000 16 млн 16 Kb 64 Mb 1.17 сек 3.99 сек 3.41 раз
5000 25 млн 20 Kb 100 Mb 1.70 сек 6.37 сек 3.75 раз
6000 36 млн 24 Kb 144 Mb 2.67 сек 10.03 сек 3.76 раз
7000 49 млн 28 Kb 196 Mb 4.17 сек 18.12 сек 4.35 раз
8000 64 млн 32 Kb 256 Mb 4.12 сек 22.22 сек 5.39 раз
Впрочем, если Вы называете это "туфтой", то предложите пожалуйста, какую-нибудь другую задачу, которая на Ваш взгляд не являлась бы "туфтой".
VD> Тут ты меряешь время заполнения ссылк. ЖЦ же вообще не работает (удалять то нечего).
Я-то, как раз измеряю "время создания структуры" + "время сборки мусора". А вот Вы используя
struct вместо
class не создавали ссылок, следовательно, и в самом деле не измеряли скорость работы GC, надо было использовать
class.
VD> К тому же минимальный объект в дотнете == 8 байтам. Так что и каждый объект и каждый массив в дотнете хранит лишние 8 байт.
Естественно, BlackBox тоже для каждого объекта хранит указатель на дескриптор типа, так что реальный размер объекта на самом деле чуть больше чем сумма размеров его полей, ну и что из этого следует? Какая, по большому счету, разница имеет ли объект размер V = 4*N байтов или V = 4*N + delta, где delta ~ 8 байтов, в тех случаях когда N = 2000, ..., N = 8000? Думаю разницы никакой...