The OpenNET Project / Index page

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



"Первый официальный выпуск rav1e, кодировщика AV1 на языке Rust "
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Заметили полезную информацию ? Пожалуйста добавьте в FAQ на WIKI.
. "Первый официальный выпуск rav1e, кодировщика AV1 на языке Ru..." +3 +/
Сообщение от Аноним84701 (ok), 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 -- меня таки немного пугает ;)
Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Первый официальный выпуск rav1e, кодировщика AV1 на языке Rust , opennews, 09-Ноя-19, 22:06  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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