25 March, 2009

Очередные косяки в .NET Profiling API

Есть такой event JITInlining который спрашивает у профайлера будем ли в функцию A инлайнить функцию B. Обычно эти event'ы возникают между JITCompilationStarted и JITCompilationFinished. Что на самом деле довольно логично: начали компиляцию, проинлайнили чего-нибудь, закончили компиляцию. Но вот, откуда ни возьмись, появляются независимые JITInlining без обрамления начала и конца компиляции. Поиследовав немного этот вопрос я нашел, что token функции в которую производятся инлайны всегда 0x06000000 - что на самом деле говорит нам, что токена у такой функции нет. Token класса такой же пустой - 0x02000000. Выводы? А их нет - это косяк, хотя и довольно безобидный.

Еще косячок посерьезнее - после event'a AppDomainShutdownStarted могут происходить компиляции finalizers в application domain для которого был вызван AppDomainShutdownStarted. С другой стороны в документации написано, что id application domain стабилен и правилен только до окончания вызова AppDomainShutdownStarted.

Освобождаем буфер в std::string

Задача вроде банальная, но если приглядется то ни один метод напрямую не позволяет освободить буфер у std::string. Вот мое решение этой задачки:
str.swap(std::wstring());
Естественно все работает и для std::wstring.

18 March, 2009

Банальная разница

Ну все наверно знают функцию GetCommandLine(). Ну скажите какого черта нужно было сделать эту функцию по разному в Windows и в WindowsCE? Ну почему в последнем случае executable file не добавляется в начало в качестве первого аргумента? Другими словами, если мы просто запустили программу без аргументов под WindowsCE, то всегда будем получать пустую строчку в результате вызова GetCommandLine()!

17 March, 2009

Puzzle: Fast Bit Counting

Тут несколько способов быстро узнать количество бит в слове.

07 March, 2009

Locks and exceptions do not mix

Статья рассказывает о том, что есть серьезная проблема с локами в C# при использовании thread abort.

05 March, 2009

Нахождение наименьшего общего делителя (НОД)

Нашел несколько вариантов алгоритма нахождения НОД, реализовал их на С++ и решил сравнить по скорости. Вопреки моему ожиданию, а я поставил на бинарный алгоритм Евклида, победил обычный алгоритм Евклида (разница примерно в 1.3 раза). Его тут и привожу:
size_t NOD(size_t a, size_t b)
{
    while (a != 0 && b != 0)
        if (a >= b)
            a = a % b;
        else
            b = b % a;
    return a + b;
}