Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2017, 11:45   #21
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Критика у вас не конструктивная. Раз пошли считать "итерации", то примите к сведению кеш и конвеер процессора. Все эти итерации поместятся в конвеер оптимальным образом и будут исполнятся по 8 инуструкций за такт. Ваш "более меньший" код вызывает проверки условий, т.о. будут промахи предсказаний, т.о. при каждом промахе конвеер будет сбрасываться и исполнять по 1 инструкции за такт.

...кроме того, вариант с циклами может быть легко повешен сразу на 8 ядер, легким мановением руки

__gnu_parallel::for_each
текст про итерации относился не к вам. Ваш код более интересен, но в принципе делает то же самое.

Да, ваш вариант красивый, только хотелось бы работать со ссылками

Последний раз редактировалось bugaboo; 20.06.2017 в 11:51.
bugaboo вне форума Ответить с цитированием
Старый 20.06.2017, 12:00   #22
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Пожалуйста, прекратите неконструктивную критику.
Такой код нет смысла критиковать.
Цитата:
Ваш простой вариант очевиден, но в нём больше итераций.
В каком месте? )))
Итерация, фактически, просто jmp. Условие - это cmp + jmp.
То есть код с if хуже даже без учета работы конвейера.
Croessmah вне форума Ответить с цитированием
Старый 20.06.2017, 12:05   #23
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Раз пошли считать "итерации", то примите к сведению кеш и конвеер процессора. Все эти итерации поместятся в конвеер оптимальным образом и будут исполнятся по 8 инуструкций за такт. Ваш "более меньший" код вызывает проверки условий, т.о. будут промахи предсказаний, т.о. при каждом промахе конвеер будет сбрасываться и исполнять по 1 инструкции за такт.

...кроме того, вариант с циклами может быть легко повешен сразу на 8 ядер, легким мановением руки

__gnu_parallel::for_each
Вы правы. Я просто обрисовал суть метода, который нужно реализовать при помощи элементарных конструкций.
Можно ли сделать такой инвариант, чтобы цикл был вызван либо la, либо lb раз без проверок?
bugaboo вне форума Ответить с цитированием
Старый 20.06.2017, 12:10   #24
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Такой код нет смысла критиковать.
Вот именно. Лучше дайте код без проверок, но с циклом в максимум(la, lb) итераций

Последний раз редактировалось bugaboo; 20.06.2017 в 12:29.
bugaboo вне форума Ответить с цитированием
Старый 20.06.2017, 12:32   #25
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Написал, но ну нафиг, бестолку тут что-либо объяснять. Он как рафа. Разговор бесполезен в принципе. )))
Croessmah вне форума Ответить с цитированием
Старый 20.06.2017, 13:02   #26
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Уж не знаю, за что вы на новичков так набрасываетесь. Я написал ifами и forами так, как нам (новичкам) понятнее. Конечно, есть способы лучше и будет интересно их увидеть. Особенно какой-нибудь красивый метод, где 1 цикл всё заполняет без проверок.
bugaboo вне форума Ответить с цитированием
Старый 20.06.2017, 13:14   #27
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Это ж Вы накинулись на замечания Вашему коду.
Цитата:
будет интересно их увидеть
Например, можно if вынести из цикла:
Код:
void sum(char*& c, char* a, char* b)
{
    auto la = strlen(a);
    auto lb = strlen(b);
    
    c = new char[la + lb + 1];
    
    char *dst_first = c;
    char *dst_second = c + la;
    
    char cache = *b;
    
    for (; (*dst_first = *a) && (*dst_second = *b); ++a, ++b, ++dst_first, ++dst_second){
    }
    
    if (*a) {
        for (;(*dst_first = *a); ++a, ++dst_first){
        }
    } else {
        for (;(*dst_second = *b); ++b, ++dst_second){
        }
    }
    *dst_first = cache;
}
Но ускорение врядли получим.

Последний раз редактировалось Croessmah; 20.06.2017 в 13:34.
Croessmah вне форума Ответить с цитированием
Старый 20.06.2017, 13:28   #28
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

И еще от дублирования кода избавимся:
Код:
void sum(char*& c, char* a, char* b)
{
    auto la = strlen(a);
    auto lb = strlen(b);
    
    c = new char[la + lb + 1];
    
    char *dst_first = c;
    char *dst_second = c + la;
    
    char cache = *b;
    
    for (; (*dst_first = *a) && (*dst_second = *b); ++a, ++b, ++dst_first, ++dst_second){
    }
    
    char *dst_adv = dst_second;
    char *src_adv = b;    
    if (*a) {
        dst_adv = dst_first;
        src_adv = a;
    }
    for (;(*dst_adv = *src_adv); ++dst_adv, ++src_adv){
    }
    *(c + la) = cache;
}
Что касается приростов скорости, то все будет зависеть от опций компилятора.

Последний раз редактировалось Croessmah; 20.06.2017 в 13:41.
Croessmah вне форума Ответить с цитированием
Старый 20.06.2017, 14:51   #29
bugaboo
Пользователь
 
Регистрация: 18.06.2017
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Например, можно if вынести из цикла:
Код:
void sum(char*& c, char* a, char* b)
{
    auto la = strlen(a);
    auto lb = strlen(b);
    
    c = new char[la + lb + 1];
    
    char *dst_first = c;
    char *dst_second = c + la;
    
    char cache = *b;
    
    for (; (*dst_first = *a) && (*dst_second = *b); ++a, ++b, ++dst_first, ++dst_second){
    }
    
    if (*a) {
        for (;(*dst_first = *a); ++a, ++dst_first){
        }
    } else {
        for (;(*dst_second = *b); ++b, ++dst_second){
        }
    }
    *dst_first = cache;
}
Но ускорение врядли получим.
Красиво! А на big-endian не сломается?
bugaboo вне форума Ответить с цитированием
Старый 20.06.2017, 15:08   #30
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Любителям скорости рекомендую ознакомиться с исходником стандартной функции strcpy...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MMX сложить два числа gansm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 29.10.2010 05:16
как сложить два числа с плавающей точкой forsy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 29.03.2010 02:15
Макрос: сложить два числа белочка Microsoft Office Excel 6 23.12.2009 22:02
Сложить два числа и вывести результат на экран We1c0m3 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.05.2009 11:41
Сложить два числа iwaniwan Win Api 3 23.04.2009 06:27