В поисках аналога Boolean.TRUE из Java
От: AutumnLeaf Великобритания  
Дата: 12.05.15 21:24
Оценка: 1 (1)
Есть такое в .NET? Как избежать боксинга каждый раз когда нужно передать true/false туда, где параметр типа object?
Re: В поисках аналога Boolean.TRUE из Java
От: MozgC США http://nightcoder.livejournal.com
Дата: 12.05.15 21:48
Оценка: +2
Здравствуйте, AutumnLeaf, Вы писали:

AL>Есть такое в .NET? Как избежать боксинга каждый раз когда нужно передать true/false туда, где параметр типа object?


Оверхед от боксинга будет порядка нескольких наносекунд, т.е. надо передать параметр хотя бы несколько сот миллионов раз, чтобы заметить этот оверхед. Оно вам точно нужно?
Re: В поисках аналога Boolean.TRUE из Java
От: hi_octane Беларусь  
Дата: 12.05.15 22:17
Оценка: 7 (6)
AL>Есть такое в .NET? Как избежать боксинга каждый раз когда нужно передать true/false туда, где параметр типа object?

Ну если реально критично, то можно сделать экстеншн-метод:

public static class MadHelper
{
    private static readonly object trueObj = true;
    private static readonly object falseObj = false;

    public static object bool Obj(this bool val)
        {
        return val ? trueObj : falseObj;
        }

    //если надо нуллабл
    public static object bool Obj(this bool? val)
        {
        return val.HasValue ? (val.Value ? trueObj : falseObj) : null;
        }
}

//ну и использовать как-то так:
var b = true;
b.Obj();
//или сразу
true.Obj();


Но на практике это надо специально изобретать тест, чтобы такое понадобилось.
Re: В поисках аналога Boolean.TRUE из Java
От: xy012111  
Дата: 13.05.15 05:38
Оценка: 4 (3) +1
Здравствуйте, AutumnLeaf, Вы писали:

AL>Есть такое в .NET? Как избежать боксинга каждый раз когда нужно передать true/false туда, где параметр типа object?


Стандартного нету. В WPF, например, своё сделали (см. BoleanBox или как-то так тип называется). Вот примерно это о чём: Tip: Improving Boolean Dependency Properties’ Performance
Re[2]: В поисках аналога Boolean.TRUE из Java
От: hardcase Пират http://nemerle.org
Дата: 13.05.15 09:01
Оценка: 8 (1) +1
Здравствуйте, hi_octane, Вы писали:

_>Ну если реально критично, то можно сделать экстеншн-метод:


Если уж так загоняться на перфоманс, то:

    //если надо нуллабл
    public static object bool Obj(this bool? val)
        {
        return val.HasValue ? (val.GetValueOrDefault() ? trueObj : falseObj) : null;
        }
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: В поисках аналога Boolean.TRUE из Java
От: hi_octane Беларусь  
Дата: 13.05.15 10:04
Оценка:
Действительно, на одну проверку меньше получается.
Re[2]: В поисках аналога Boolean.TRUE из Java
От: AutumnLeaf Великобритания  
Дата: 19.05.15 01:53
Оценка:
Здравствуйте, MozgC, Вы писали:

MC>Оверхед от боксинга будет порядка нескольких наносекунд, т.е. надо передать параметр хотя бы несколько сот миллионов раз, чтобы заметить этот оверхед. Оно вам точно нужно?


Так еще ведь оверхед по памяти и нагрузка на GC
Re[2]: В поисках аналога Boolean.TRUE из Java
От: AutumnLeaf Великобритания  
Дата: 19.05.15 01:55
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Ну если реально критично, то можно сделать экстеншн-метод:


_>Но на практике это надо специально изобретать тест, чтобы такое понадобилось.


Ну да, я тоже о таком подумал, но ожидал это увидеть в самой платформе...
Re[3]: В поисках аналога Boolean.TRUE из Java
От: MozgC США http://nightcoder.livejournal.com
Дата: 19.05.15 02:49
Оценка: +3
Здравствуйте, AutumnLeaf, Вы писали:

AL>Так еще ведь оверхед по памяти и нагрузка на GC


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

Я вам не советую особо заморачиваться по поводу боксинга. Ну т.е. если его можно легко избежать — избегайте, а в противном случае — не забивайте голову, сконцентрируйтесь на бизнес-задачах. А о боксинге надо думать либо при разработке библиотек, либо когда он действительно является узким местом и влияет на перфоманс какого-то процесса.
Re[4]: В поисках аналога Boolean.TRUE из Java
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.05.15 12:17
Оценка: 16 (2) +2
Здравствуйте, MozgC, Вы писали:

MC>Короткоживущие объекты не создают заметной нагрузки на GC. Ко времени очередной сборки большинство созданных короткоживущих объектов уже будут недостижимы для GC, он просто их не будет учитывать, пометит объекты, которые достижимы (т.е. на которые можно дойти по ссылкам начиная с корней), и дефрагментирует кучу.


Хотя это так, но все же не выделение памяти 100%-но быстрее ее выделения. Смотри какие минимальные затраты создает выделение объектов:
1. Выделяемая память должна быть проинициализирована нулями. Это делается для больших блоков, потому не особо заметно на глаз, но все же время по любому тратится.
2. При создании объектов нужно обеспечить многопоточную безопасность. Даже если это всего один итрерлок, все равно это способно уменьшить производительность многопоточного приложения.
3. Рантайму нужно проинициализировать внутренние структуры объекта. Это нужно для GC и для того чтобы можно было получать инфотмацию о типах в рантайме.
4. При сборке мусора большое количество умерших объектов будет "разряжать" граф объектов, что приведет к увеличению промахов мимо кэша.
5. Распухание области отводимой под нулевое поколение GC приведет к более частым сборкам мусора.

Все это не так критично и при обычно этим можно пренебречь, но надо четко понимать, что не выделение памяти всегда быстрее ее выделения. Так что в критичных местах имеет смысл производить оптимизации вроде описанных в этой теме. Насколько я знаю в новом компиляторе Шарпа (из Розлина) во всю используются пулы объектов. Это делается именно в погоне за производительностью.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.