@ralpt

Быстро ли мое решение?

Задача: Есть буфер (массив) который периодически изменяется и обрабатывается. Мне требуется обрабатывать вновь появившиеся данные + сохранять часть. Т.е. обрабатывается вновь прибывший буфер и часть старого.
Я подумал зачем заниматься перезаписью и реализовал решение аналогичное примеру ниже:

int a[] = {1,2,3,4};
int b[] = {5,6};
int* c[6];
for(size_t i=0; i<4; i++){
    c[i] = a+i;
}
for(size_t i=0; i<2; i++){
    c[i+4] = b+i;
}
for(int i=0; i<6; i++){
    printf("%d\n", c[i][0]);
}

Вывод: 1 2 3 4 5 6.

Т.е. я иду по массиву неизменяемых указателей и работаю с ним.
Является ли это быстрым решением? Большой буфер, кусочек старого требуется маленький. Или будет быстрее и правильней создать еще один массив и туда переносить все через memcpy?

Подскажете литературу в этом направлении (как правильно писать быстрый код, связь с ассеблером, связь с механизмами ОС, распараллеливание)?
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Самый быстрый вариант, конечно, будет изменить вашу программу так, чтобы она могла работать с несколькими кусками, без всяких предварительных подготовок.

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

Но на практике все зависит от кучи факторов. Много ли у вас чисел, попадают ли они в кеш процессора, как далеко лежат две части буффера, как долго идет обработка каждого числа. Проверить это в итоге можно только практикой, но, скорее всего, ваше текущее решение будет быстрее memcpy, потому что единственное приемущество memcopy будет в том, что данные лежат в памяти подряд, что очень дружественно к кешу. Но вашем текущем решении и сами указатели и то, куда они указывают, итак лежат в памяти подряд (кроме одного индекса, где меняются массивы).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Измерение перформанса - это великое искусство. В данном конкретном приложении скорее всего узким местом будет не игры с массивами а конкретно печать на экране
printf("%d\n", c[i][0]);
поэтому из быстрых алгоритмов печать надо вышвырнуть. Или заменить ее на агрегацию результата или
думать об асинхронных и параллельных операциях записи результата в файл если уж он так сильно нужен.

Очень многие начинающие прокалываются на этом. Еще попробуй отказаться от индекса в массиве и заменить
его на "подвижный" указатель по массиву. Часто бывает что умные компилляторы умеют распознавать такой шаблон но я-бы предложил написать две реализации и сравнить.

Ну и размер твоих массивов должен меряться мегабайтами чтобы ты хоть что-то почувствовал при замерах. Иначе будешь мерять только квантовый шум.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы