The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Первый официальный выпуск rav1e, кодировщика AV1 на языке Ru..."
Отправлено Аноним84701, 10-Ноя-19 21:18 
> Так вот, мой "realloc" не перемещает память в подобном коде навскидку в 90% вызовах, а уточнять мне лениво, как и смотреть переменённую стратегию роста кучи. Но лет 10 назад я бы тоже таким кодом пугал.

Хм, похоже, кто-то за деревьями не видит леса (вот поэтому при непонятках все же лучше просто спросить, а не намекать непоянтно на что).

Просто все это -- куча оверхеда на абсолютно ровном месте. Не забываем о двух вещах:
1) речь о чтении данных
2) времена, когда при чтении ограничивались парой сотен байтов, минули давно …
Т.е. при прочтении/приеме жалкого мегабайта будет миллион вызовов realloc и (что заметнее) read.

Ладно, "a demo is worth a thousand words".
Заморачиваться с realloc (который там не главное - хотя оверхед при использовании таким макаром тоже даcт вполне заметный) я не буду - "и так сойдет", просто считаем 5МБ в "никуда", по 1, 10 и 100 байтов за раз:


#include <stdlib.h>                                                                      
#include <fcntl.h>                                                                      
                                                                                        
int main (int argc, char** argv) {                                                      
    if (argc != 2) return -1;                                                            
                                                                                        
    int fd = open("/dev/zero", O_RDONLY);                                                
    ssize_t cnt = 0;                                                                    
    size_t n = atoi(argv[1]);                                                            
                                                                                        
    char buf[100];                                                                      
    while(cnt < 5*1024 * 1024) {                                                        
        cnt += read(fd, buf, n);                                                        
                                                                                        
    }                                                                                    
    return 0;                                                                            
}                                                                                                


% gcc -O2 rd.c
% time ./a.out 1 && time ./a.out 10 && time ./a.out 100
./a.out 1  0,15s user 1,40s system 99% cpu 1,551 total
./a.out 10  0,02s user 0,12s system 99% cpu 0,136 total
./a.out 100  0,01s user 0,01s system 96% cpu 0,014 total

% dd if=/dev/zero of=/dev/null bs=1M count=10000
10485760000 bytes (10 GB, 9,8 GiB) copied, 0,661329 s, 15,9 GB/s


Так понятнее?
Ну да, код с пропускной способностью в 3.3МБ/c вместо возможных пары ГБ/c -- меня таки немного пугает ;)
 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру