Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ОПТИМИЗАЦИЯ КОДА 
:(
    Опции темы
_aleks_
Дата 31.3.2005, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.3.2005

Репутация: нет
Всего: нет



Может подскажет кто-нибудь как эту функцию можно ещё оптимизировать smile

Код

unsigned char func_grayscale(unsigned long int color)
{
    unsigned long int color;
    unsigned char grayscale;
    char *pb = (char *)&color;
    return (*pb)*0.11+(*(pb+1))*0.59+(*(pb+2)*0.3;
}



Это сообщение отредактировал(а) _aleks_ - 31.3.2005, 06:09
PM MAIL   Вверх
chipset
Дата 31.3.2005, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Начнём с того что он не компилируется, у тебя траблы со скобками, нужно так:
Код

return (*pb)*0.11+(*(pb+1))*0.59+(*(pb+2)*0.3);

Во-вторых не скомпилируется ибо:
Цитата
error C2082: redefinition of formal parameter 'color'
, и редифинишн color нужно выкинуть нафиг.
В-третьих, зачем указатель pb?, приходится раскрывать его всё время, что ест операции.
В-чётвёртых, зачем pb вообще если можно привести потом всё в конце static_cast'ом?
В-пятых, почему заголовок большими буквами?

Это сообщение отредактировал(а) chipset - 31.3.2005, 06:37


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fire-Plug
Дата 31.3.2005, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



_aleks_
Похоже, что тебе надо вычислить значение след.выражения:

1-й байт * 0.11+ 2-й байт * 0.59 + 3-й байт*0.3.

Что, кстати, закодировано в байтах color - RGB?
Итак, мне видится 2 подхода к решению:

1) union
Код

unsigned char grayscale(unsigned long nColor)
{
    union _COLOR
    {
        unsigned char chB[4];
        unsigned long nB;    

    } unColor;
    unColor.nB= nColor;

    return (unsigned char)(unColor.chB[0]*0.11 + unColor.chB[1]*0.59 + unColor.chB[2]*0.3); 
}

2) битовые операции
Код

unsigned char grayscale2(unsigned long nColor)
{
    unsigned char b1= (unsigned char)( nColor & 0xFF);
    unsigned char b2= (unsigned char)((nColor & 0xFF00) >> 8);
    unsigned char b3= (unsigned char)((nColor & 0xFF0000) >> 16);

    return (unsigned char)(b1*0.11 + b2*0.59 + b3*0.3); 
}

Следует иметь в виду, что тип результата выражения - double, хоть и множество его значений находится в пределах [0...255].
Ну что с ним делать уже решать тебе.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
_aleks_
Дата 31.3.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.3.2005

Репутация: нет
Всего: нет



Дело в том что надо, чтобы функция выполнялась как можно быстрее, поэтому я подумал что если арифметические операции будут выполняться паралельно то время выполнения уменьшиться smile

Код


unsigned char func_grayscale(unsigned long int color)
{
    unsigned long int color;
    unsigned char grayscale, r, g ,b;
    char *pb = (char *)&color;
    b=(*pb)*0.11;
    g=(*(pb+1))*0.59;
    r=(*(pb+2))*0.3;
    return r+g+b;
}

PM MAIL   Вверх
oleg1973
Дата 31.3.2005, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



маразм однако, вот где индейцы побеждают smile
Код

int super(color)
{
    int result;

    _asm
    {
            mov ecx,color
            movzx eax,cl
            mov edx,0x3de147ae //0.11
            mul edx
            mov ebx,eax

            movzx eax,ch
            mov edx,0x3f170a3d //0.59
            mul edx
            add ebx,eax

            shr ecx,16

            movzx eax,cl
            mov edx,0x3e99999a //0.3
            mul edx
            add ebx,eax
            mov result,ebx

    }
    return result;
}



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
cardinal
Дата 31.3.2005, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



А если еще учесть, что
Код

    b=(*pb)*0.11;
    g=(*(pb+1))*0.59;
    r=(*(pb+2))*0.3;

и
Код

    b=(*pb)*0.125; // << 3
    g=(*(pb+1))*0.5; // << 1
    r=(*(pb+2))*0.375; // << 3) * 3

почти никак не повлияют на результат, то можно сделать еще на порядок быстрее...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Fixin
Дата 31.3.2005, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Хороший вариант у oleg1973 (естественно smile), но тормозны операции с плавучей точкой. Там их три, а можно сделать одну:
Код
b=(*pb)*11;
g=(*(pb+1))*59;
r=(*(pb+2))*30;
return (unsigned char)((r+g+b)/100);


Это сообщение отредактировал(а) Fixin - 31.3.2005, 17:24
PM MAIL ICQ   Вверх
maxim1000
Дата 31.3.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



делить вообще не стоит smile
вместо 100 можно взять степень двойки, тогда можно будет просто сдвинуть...


--------------------
qqq
PM WWW   Вверх
cardinal
Дата 31.3.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Fixin, посмотри что я написал smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
En_t_end
Дата 31.3.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Если уж такая тема, то и мне помогите, но у меня скорее задача решена правильно, но как всегда по-тупому smile
ЗЫ просьба не пинать smile
Код

//Программа для игры "камень-бумага-ножницы".
//R - камень
//P - бумага
//S - ножницы
#include "stdafx.h"
#include "iostream"
using namespace std;

void main(){
    char player1;
    char player2;
    cout << "First player, enter you argument. R(r) or P(p) or S(s).\n";
    cin >> player1;
    system("cls");
    cout << "Second player, enter you argument. R(r) or P(p) or S(s).\n";
    cin >> player2;
    switch(player1){
        case 'p':
        case 'P':
            switch(player2){
        case 'r':
        case 'R':
            cout << "Player1 - You WON!!!\n";
            break;
        case 's':
        case 'S':
            cout << "Player2 - You WON!!!\n";
            break;
        default:
            cout << "Player1 - Not won...Player2 - Not won.\n";
            }
            break;
                    
        case 'r':
        case 'R':
            switch(player2){
        case 's':
        case 'S':
            cout << "Player1 - You WON!!!\n";
            break;
        case 'p':
        case 'P':
            cout << "Player2 - You WON!!!\n";
            break;
        default:
            cout << "Player1 - Not won...Player2 - Not won.\n";
            }
            break;

        case 's':
        case 'S':
            switch(player2){
        case 'p':
        case 'P':
            cout << "Player1 - You WON!!!\n";
            break;
        case 'r':
        case 'R':
            cout << "Player2 - You WON!!!\n";
            break;
        default:
            cout << "Player1 - Not won...Player2 - Not won.\n";
            }
            break;
    }

//    P > R R > S S > P
}

PM MAIL ICQ Skype GTalk Jabber   Вверх
Fixin
Дата 31.3.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Цитата(cardinal @ 31.3.2005, 17:38)
Fixin, посмотри что я написал smile

Ага, угу, ну да. Но так понятнее smile
PM MAIL ICQ   Вверх
oleg1973
Дата 31.3.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



Fixin
Цитата
но тормозны операции с плавучей точкой

а где они там у меня?
там простое умножение без FPU


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
maxim1000
Дата 31.3.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата
Если уж такая тема, то и мне помогите, но у меня скорее задача решена правильно, но как всегда по-тупому
ЗЫ просьба не пинать

ну все-таки тема чужая smile

Код

char Array[3]={'r','p','s'};
char CharToLow(char x)//знаю, что есть такая функция, вспоминать лень...
{
  if(x<'A')
    return x;
  if(x>'Z')
    return x;
  return x-'A'+'a';
}
void main()
{
  char player1,player2;
  int n;
  //get players input
  //...
  player1=CharToLow(player1);
  player2=CharToLow(player2);
  for(n=0;n<3;n++)
  {
    if(Array[n]==player1)
      break;
  }
  if(n==3)
  {
    cout<<"RTFM!..\n";
    return;
  }
  if(player2==Array[(n+1)%3])
    cout<<"player2 won\n";
  else
    cout<<"player1 won\n";
}


Это сообщение отредактировал(а) maxim1000 - 31.3.2005, 17:49


--------------------
qqq
PM WWW   Вверх
Doc_d0s
Дата 31.3.2005, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



Код

unsigned char func_grayscale(unsigned long int color)
{
    unsigned long int color;////!!!!!! тут не надо переопределять color
    unsigned char grayscale;// а зачем он тут нужен?:)
    char *pb = (char *)&color;
    return (*pb)*0.11+(*(pb++))*0.59+(*(pb++)*0.3;
}


Вот такsmile)
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
En_t_end
Дата 31.3.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



maxim1000 
Верно !
Но вот только тут одна проблема smile, я по книжке ещё ламо и там не предполагается, что я знаю массивы и соответственно операции над ними. ЗЫ так что мне наверное придется так и остаться со своим тупым свичем smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1075 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.