> Я ожидал увидеть зашкаливание времени
"зашкаливание" предполагает наличие "шкалы", т.е. опорного времени для сравнения. Вы же не знаете ни того, сколько занимает rdtsc, ни того, сколько занимает чтение из кеша.
> valgrind работает с отладочной версией программы Армянское Радио: отладочная информация нужна для полноты стектрейсов. Это означает, что при сборке нужно дать опцию -g компилятору и линковщику. Код программы при этом может быть "релизным" (-O2, NDEBUG, ...).
По части замедления в 50-100 раз я не уверен, мне кажется, что оно на порядок меньше.
Нет, ничего не изменится: функция у вас одна, вне зависимости от того, сколько объектов вы создадите.
Если вы хотите переменную поместить в объект, то добавьте поле в определение класса.
> здесь написан перевод из беззнакового в знаковый
где?
> перевод из беззнакового в знаковый, который выполняется в зависимости от реализации
он выполняется в зависимости от реализации в единственном случае: когда исходное значение не может быть представлено типом, к которому выполняется приведение.
> Оптимизатор, видя что в переменной now особого смысла нет, не стал ее создавать, а банально передал в sprintf то, что получил от процедуры RX (а RX наверняка выдает int).
Не может правильно работающий оптимизатор выкинуть приведение типа.
За brainbench.com -- плюс, за "сертификаты по С/C++ бессмысленны" -- минус. Есть разница между глубиной именно языковых знаний у людей, набравшх там больше 4.9 и меньше 4.5.
Я думаю, только создав свой промежуточный буфер -- в него складывать всё, что приходит из коллбэка, из него брать кусками фиксированного размера, когда набирается достаточно данных.
> Посчитал с помощью ps aux|awk '{s+=$6} END {print s}'
Сумма RSS? Но какой в этом смысл? RSS отражает сколько физической памяти ядро использует под задачу, это число слабо коррелирует с возможными утечками памяти.
Скорее стоило бы смотреть на VIRT (он же VSZ) вашего процесса -- сколько виртуальной памяти он занимает.
> как понять, что именно поедает память?
Смотрите в:
- cat /proc/meminfo : Slab, KernelStack, PageTables;
- cat /proc/vmallocinfo: вторая колонка (после диапазона адресов) -- количество выделенных страниц;
- cat /proc/slabinfo -- если Slab в /proc/meminfo большой.
> 158м used памяти написано в выводе команды free во второй строчке.
Ок, 158 по мнению free используется без учёта кэша/буферов.
А откуда берётся "Судя по top видно, что съедено в общей сложности 45788кб памяти"?
Так, по порядку:
1. O_DIRECTORY не влияет на открытие каталогов вызовом open, он влияет на открытие не-каталогов (попытка открыть не-каталог при указанном O_DIRECTORY -- это ошибка).
2. 0200000 = 0x10000
3. open во всех ваших скриншотах успешен, а валится readdir, потому что вы ему передаёте NULL там где должен быть указатель на буфер.
Странно. Попробуйте git push origin +HEAD:<имя-ветки-на-bitbucket>
И не могли бы вы вместо написания собственного ответа писать комментарии к ответам, которые вы хотите прокомментировать?
Xano: в тех случаях, когда sizeof(int) отличается от sizeof(int{32,64}_t): компилятору придётся либо добавлять расширение знаком в арифметику, либо оперировать с лишними регистрами. Типы с фиксированным размером хороши для сериализации и в ABI, в остальных местах, если хочется гарантировать диапазон допустимых значений переменных, лучше использовать int_fast*_t.
"зашкаливание" предполагает наличие "шкалы", т.е. опорного времени для сравнения. Вы же не знаете ни того, сколько занимает rdtsc, ни того, сколько занимает чтение из кеша.