Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

HSB2RGB: Оптимизация

34K
24 декабря 2007 года
7th
1 / / 24.12.2007
Здравствуйте, уважаемые господа.

Некоторое время тому назад мне необходимо было написать функциональность преобразование цвета из HSB в RGB. Я нашёл код такого преобразования на CodeProject'е. Но быстродействие найденного кода категорически не устраивало. Поэтому метод, реализующий алгоритм преобразования был написан собственноручно:

Код:
public static Color HSB2RGB(byte aAlpha, byte aHue, byte aSaturation, byte aBrightness)
{
    int temp = aBrightness * (0xFF - aSaturation) >> 8;
    if (aHue < 43)
        return Color.FromArgb(aAlpha, aBrightness, aBrightness * (0x2AD5 - (43 - aHue) * aSaturation) / 0x2AD5, temp);
    else if (aHue < 86)
        return Color.FromArgb(aAlpha, aBrightness * (0x2AD5 - (aHue - 43) * aSaturation) / 0x2AD5, aBrightness, temp);
    else if (aHue < 129)
        return Color.FromArgb(aAlpha, temp, aBrightness, aBrightness * (0x2AD5 - (129 - aHue) * aSaturation) / 0x2AD5);
    else if (aHue < 172)
        return Color.FromArgb(aAlpha, temp, aBrightness * (0x2AD5 - (aHue - 129) * aSaturation) / 0x2AD5, aBrightness);
    else if (aHue < 215)
        return Color.FromArgb(aAlpha, aBrightness * (0x2AD5 - (215 - aHue) * aSaturation) / 0x2AD5, temp, aBrightness);
    else
        return Color.FromArgb(aAlpha, aBrightness, temp, aBrightness * (0x2AD5 - (aHue - 215) * aSaturation) / 0x2AD5);
}


Быстродействие такого кода вполне устраивало, он вошёл в корпоративный фреймворк и успешно используется по сей день. Но один только вопрос мучит до сих пор: можно ли написать лучше? Размер, понятность, "красивость" кода роли не играют. Единственный критерий оптимизации -- скорость выполнения.

Заранее благодарю за ответы, 7th.
5
24 декабря 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: 7th
можно ли написать лучше?


С первого взгляда альтернативного алгоритма не вижу. Могу только сказать, что в C# использовать byte для передачи параметров и в арифметике - бессмысленно. Лучше использовать int. Ну и конечно unchecked, чтобы компилер и не пытался ставить код проверки переполнения.

Код:
public static Color HSB2RGB(int aAlpha, int aHue, int aSaturation, int aBrightness)
{
    unchecked {
        int temp = aBrightness * (0xFF - aSaturation) >> 8;
        if (aHue < 43)
            return Color.FromArgb(aAlpha, aBrightness, aBrightness * (0x2AD5 - (43 - aHue) * aSaturation) / 0x2AD5, temp);
        else if (aHue < 86)
            return Color.FromArgb(aAlpha, aBrightness * (0x2AD5 - (aHue - 43) * aSaturation) / 0x2AD5, aBrightness, temp);
        else if (aHue < 129)
            return Color.FromArgb(aAlpha, temp, aBrightness, aBrightness * (0x2AD5 - (129 - aHue) * aSaturation) / 0x2AD5);
        else if (aHue < 172)
            return Color.FromArgb(aAlpha, temp, aBrightness * (0x2AD5 - (aHue - 129) * aSaturation) / 0x2AD5, aBrightness);
        else if (aHue < 215)
            return Color.FromArgb(aAlpha, aBrightness * (0x2AD5 - (215 - aHue) * aSaturation) / 0x2AD5, temp, aBrightness);
        else
            return Color.FromArgb(aAlpha, aBrightness, temp, aBrightness * (0x2AD5 - (aHue - 215) * aSaturation) / 0x2AD5);
    }
}
276
25 декабря 2007 года
Rebbit
1.1K / / 01.08.2005
Ну раз уж так оптимизируем жостко. Я в .NET не очень, но скажите, что будет быстрее ? несколько ифов или свич ? Ежели свич будет лутше, причем настолько чтоб компенсировать одно деление..... то дальше и так понятно. Хотя я оч сомневаюсь что свич сумеет настолько иф обойти по скорости. Впрочем ето можно проверить експериментально.
5
25 декабря 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: Rebbit
скажите, что будет быстрее ? несколько ифов или свич ?

В большинстве языков свич на 5 веток эквивалентен 5 "ифам", т.к. компилятор строит таблицу переходов где-то начиная с 7 веток.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог