Использование слабых ссылок для повышения производительности
Запись от belugin размещена 22.03.2013 в 16:46
Как широко известно, в X++ используется подсчет ссылок в качестве сборки мусора.
Причем для того, чтобы собирать циклы (когда объект A ссылается на B а B на A) используется счетчик циклов.
Таким образом, каждый раз при присваивании поля класса, аксапта проходит по всем ссылкам и пытается найти циклы чтобы обновить счетчик.
Это может быть очень долго. Особенно если есть циклы.
Но есть способ сделать ссылку, которая точно не приводит к образованию цикла. Это “слабая ссылка” – класс ObjectIdent.
Суть в том, что такая ссылка не удерживает объект на который ссылается и он может быть собран сборщиком мусора.
Таким образом, если мы уже знаем что объект уже используется где-то еще и точно не удалится, то мы может сделать на него слабую ссылку (передав его аргументом конструктора ObjectIdent ) а потом добыть его из этой ссылки при помощи метода object.
На моем примере, содержащем, кучу циклических ссылок, вышло так:
Под IL быстрее, так как там не используется подсчет ссылок (но и не гарантируется удаление объекта сразу после окончания использования)
Причем для того, чтобы собирать циклы (когда объект A ссылается на B а B на A) используется счетчик циклов.
Таким образом, каждый раз при присваивании поля класса, аксапта проходит по всем ссылкам и пытается найти циклы чтобы обновить счетчик.
Это может быть очень долго. Особенно если есть циклы.
Но есть способ сделать ссылку, которая точно не приводит к образованию цикла. Это “слабая ссылка” – класс ObjectIdent.
Суть в том, что такая ссылка не удерживает объект на который ссылается и он может быть собран сборщиком мусора.
Таким образом, если мы уже знаем что объект уже используется где-то еще и точно не удалится, то мы может сделать на него слабую ссылку (передав его аргументом конструктора ObjectIdent ) а потом добыть его из этой ссылки при помощи метода object.
На моем примере, содержащем, кучу циклических ссылок, вышло так:
- Запуск под X++ - 717074
- Запуск под IL - 5335
- Запуск под X++ со слабой ссылкой - 8814
Под IL быстрее, так как там не используется подсчет ссылок (но и не гарантируется удаление объекта сразу после окончания использования)
Всего комментариев 1
Комментарии
-
Шикарно.
Знать бы об этом пораньше, когда под IL нельзя было запускать.
Если не секрет, какое место вы проверяли ? Разноску в ГК ?Запись от Logger размещена 26.09.2014 в 13:24