Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783

Замеры скорости работы malloc'а на Windows и Linux

10.01.2011, 15:41. Показов 8630. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
quote=DenQ;1273702]Хорошо, а что тогда high?[/quote]
real-time системы.
Цитата Сообщение от Evg Посмотреть сообщение
А можно поподробнее. gcc-4.4 это на линуксе или на винде тоже? Скорость работы malloc'а в первую очередь зависит от libc, а не от операционной системы. Если использовался под виндой gcc, то какой версии glibc и там и там? Такой тест, на мой взгляд, честно проверять "gcc+glibc vs msvc". К тому же нужен вариант постоянного выделения маленьких фрагментов, постоянного выделения срежних фрагментов, постоянного выделения больших фрагментов и впермешку выделение фрагментов разных размеров. Только тогда тест может быть хотя бы в первом приближении показательным. То, что из себя сейчас представляет тест на текущий момент - это не более, чем статистика, которой Марк Твен отвёл известное место в иерархии достоверных сведений
gcc4.4 и там и там. Лучше, наверно, называть просто libc, без g. Версия на линуксе /lib/libc-2.12.1.so. Версия под виндоуз отсутствует. В связи с этим заявление, что скорость выделения памяти зависит от libc, выглядит сомнительно.

В теории, скорость выделения памяти и там и там должна быть одинаковой, это не жесткий диск и алгоритмы в обеих ОС достаточно схожие. Нет никакой разницы на каких блоках памяти тестировать. Скорость выделения памяти должна иметь зависимость от выделяемого объема и не отличаться в скорости выделения на байт информации при выделении больших или меньших объемов (с оговоркой на границы страниц памяти). В теории, разница должна быть исключительно в накладных расходах на системный вызов и составлять в лучшем случае тысячные доли секунды, а не 10%, как у меня. Поэтому мои результаты сомнительны.

С VC вы, возможно, правы. В общем случае он создает более эффективный код, чем gcc. У них ведь есть fastcall. В любом случае, тест надо переделывать.

Новый тест будет на С. Будет выделять блоки от нуля до двух гигабайт с шагом в 64 мегабайта. Как бы винда не загнулась на таком выделении.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]) {
  char *memory = NULL;
 
  for (int i = 0; i < 2048; i += 64) {
    clock_t start_ = clock();
    int operation_count = 10240;
    for (int j = 0; j < operation_count; ++j) {
      memory = (char*)malloc(1024 * 1024 * i);
      free(memory);
    }
    printf("%d mebabytes in %f\n",  i, ((double)(clock() - start_) / CLOCKS_PER_SEC));
  }
 
  int key;
  scanf("%d", &key);
  return 0;
}
Ubuntu 10.10, gcc 4.4, libc-2.12.1.so.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Allocated 10240 times 0 megabytes in 0.000000 sec.
Allocated 10240 times 64 megabytes in 0.270000 sec.
Allocated 10240 times 128 megabytes in 0.280000 sec.
Allocated 10240 times 192 megabytes in 0.280000 sec.
Allocated 10240 times 256 megabytes in 0.280000 sec.
Allocated 10240 times 320 megabytes in 0.300000 sec.
Allocated 10240 times 384 megabytes in 0.290000 sec.
Allocated 10240 times 448 megabytes in 0.310000 sec.
Allocated 10240 times 512 megabytes in 0.300000 sec.
Allocated 10240 times 576 megabytes in 0.320000 sec.
Allocated 10240 times 640 megabytes in 0.320000 sec.
Allocated 10240 times 704 megabytes in 0.330000 sec.
Allocated 10240 times 768 megabytes in 0.330000 sec.
Allocated 10240 times 832 megabytes in 0.340000 sec.
Allocated 10240 times 896 megabytes in 0.340000 sec.
Allocated 10240 times 960 megabytes in 0.350000 sec.
Allocated 10240 times 1024 megabytes in 0.350000 sec.
Allocated 10240 times 1088 megabytes in 0.360000 sec.
Allocated 10240 times 1152 megabytes in 0.370000 sec.
Allocated 10240 times 1216 megabytes in 0.370000 sec.
Allocated 10240 times 1280 megabytes in 0.380000 sec.
Allocated 10240 times 1344 megabytes in 0.380000 sec.
Allocated 10240 times 1408 megabytes in 0.390000 sec.
Allocated 10240 times 1472 megabytes in 0.390000 sec.
Allocated 10240 times 1536 megabytes in 0.410000 sec.
Allocated 10240 times 1600 megabytes in 0.400000 sec.
Allocated 10240 times 1664 megabytes in 0.410000 sec.
Allocated 10240 times 1728 megabytes in 0.410000 sec.
Allocated 10240 times 1792 megabytes in 0.430000 sec.
Allocated 10240 times 1856 megabytes in 0.430000 sec.
Allocated 10240 times 1920 megabytes in 0.430000 sec.
Allocated 10240 times 1984 megabytes in 0.440000 sec.
Загружусь в винду, сделаю то же самое.

Добавлено через 14 минут
Загрузился в винду. XP 5.1.2600, все обновления на сегодняшний день. Снял все возможные процессы, остановил все возможные сервисы, выключил антивирус.
Очень странные результаты.
GCC 4.4:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Allocated 10240 times 0 megabytes in 0.016000 sec.
Allocated 10240 times 64 megabytes in 0.203000 sec.
Allocated 10240 times 128 megabytes in 0.234000 sec.
Allocated 10240 times 192 megabytes in 0.281000 sec.
Allocated 10240 times 256 megabytes in 0.328000 sec.
Allocated 10240 times 320 megabytes in 0.422000 sec.
Allocated 10240 times 384 megabytes in 0.500000 sec.
Allocated 10240 times 448 megabytes in 0.609000 sec.
Allocated 10240 times 512 megabytes in 0.610000 sec.
Allocated 10240 times 576 megabytes in 0.656000 sec.
Allocated 10240 times 640 megabytes in 0.672000 sec.
Allocated 10240 times 704 megabytes in 0.656000 sec.
Allocated 10240 times 768 megabytes in 0.672000 sec.
Allocated 10240 times 832 megabytes in 0.750000 sec.
Allocated 10240 times 896 megabytes in 0.734000 sec.
Allocated 10240 times 960 megabytes in 0.657000 sec.
Allocated 10240 times 1024 megabytes in 0.718000 sec.
Allocated 10240 times 1088 megabytes in 0.735000 sec.
Allocated 10240 times 1152 megabytes in 0.718000 sec.
Allocated 10240 times 1216 megabytes in 0.813000 sec.
Allocated 10240 times 1280 megabytes in 0.859000 sec.
Allocated 10240 times 1344 megabytes in 0.797000 sec.
Allocated 10240 times 1408 megabytes in 0.875000 sec.
Allocated 10240 times 1472 megabytes in 0.890000 sec.
Allocated 10240 times 1536 megabytes in 0.922000 sec.
Allocated 10240 times 1600 megabytes in 1.016000 sec.
Allocated 10240 times 1664 megabytes in 0.937000 sec.
Allocated 10240 times 1728 megabytes in 0.875000 sec.
Allocated 10240 times 1792 megabytes in 0.922000 sec.
Allocated 10240 times 1856 megabytes in 0.937000 sec.
Allocated 10240 times 1920 megabytes in 0.938000 sec.
Allocated 10240 times 1984 megabytes in 0.984000 sec.
Сейчас будет VS.

Добавлено через 7 минут
VS 2010, 10.0.30319.1 RTMREL.
Таки значительно лучше.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Allocated 10240 times 0 megabytes in 0.000000 sec.
Allocated 10240 times 64 megabytes in 0.171000 sec.
Allocated 10240 times 128 megabytes in 0.250000 sec.
Allocated 10240 times 192 megabytes in 0.250000 sec.
Allocated 10240 times 256 megabytes in 0.266000 sec.
Allocated 10240 times 320 megabytes in 0.297000 sec.
Allocated 10240 times 384 megabytes in 0.312000 sec.
Allocated 10240 times 448 megabytes in 0.344000 sec.
Allocated 10240 times 512 megabytes in 0.391000 sec.
Allocated 10240 times 576 megabytes in 0.375000 sec.
Allocated 10240 times 640 megabytes in 0.453000 sec.
Allocated 10240 times 704 megabytes in 0.437000 sec.
Allocated 10240 times 768 megabytes in 0.454000 sec.
Allocated 10240 times 832 megabytes in 0.515000 sec.
Allocated 10240 times 896 megabytes in 0.563000 sec.
Allocated 10240 times 960 megabytes in 0.609000 sec.
Allocated 10240 times 1024 megabytes in 0.594000 sec.
Allocated 10240 times 1088 megabytes in 0.594000 sec.
Allocated 10240 times 1152 megabytes in 0.609000 sec.
Allocated 10240 times 1216 megabytes in 0.672000 sec.
Allocated 10240 times 1280 megabytes in 0.656000 sec.
Allocated 10240 times 1344 megabytes in 0.734000 sec.
Allocated 10240 times 1408 megabytes in 0.719000 sec.
Allocated 10240 times 1472 megabytes in 0.766000 sec.
Allocated 10240 times 1536 megabytes in 0.781000 sec.
Allocated 10240 times 1600 megabytes in 0.859000 sec.
Allocated 10240 times 1664 megabytes in 0.906000 sec.
Allocated 10240 times 1728 megabytes in 0.922000 sec.
Allocated 10240 times 1792 megabytes in 0.922000 sec.
Allocated 10240 times 1856 megabytes in 1.000000 sec.
Allocated 10240 times 1920 megabytes in 0.984000 sec.
Allocated 10240 times 1984 megabytes in 0.922000 sec.
Что-то разрыв стал еще больше. Проверьте кто-нибудь у себя, у кого есть линукс и VS?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2011, 15:41
Ответы с готовыми решениями:

Уменьшение скорости работы HDD и Windows
Диск: TOSHIBA MK0502TSKB Суть в том, что со временем скорость работы операционной системы и программ, требующих обращения к жёсткому...

Windows XP после 10 секунд работы перезагружается, Windows 7 и Linux на этой же материнке и HDD работают идеально?
Здраствуйте уважаемые знатоки XP помогите понять причину Windows XP и Windows 7 несколько лет прекрасно работают на одном HDD (на...

WInSCP для работы с Linux Server
есть winSCP нужно скачать с linux server(он находится на VMWare Player) файлы может я что-то ввел не так?

74
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2011, 15:44
Цитата Сообщение от lemegeton Посмотреть сообщение
gcc4.4 и там и там. Лучше, наверно, называть просто libc, без g
Я как бы в общем случае и называл "libc", а "glibc" - только в контексте того, с чем работает gcc.

Цитата Сообщение от lemegeton Посмотреть сообщение
Версия под виндоуз отсутствует
Я просто никогда не запускал gcc под виндой и не знаю, в каком виде там оно поставляется. Там может быть комплект "gcc+(потроха)+glibc", а может быть "gcc+(потроха)+системные библиотекиот самОй windows". Что означает "версия отсутсвует?" Нету библиотек glibc (т.е. используются виндузовые библиотеки) или они есть но без явного номера? Если второе, то нужно найти файл features.h и там найти макросы:

Code
1
2
#define __GLIBC__       2
#define __GLIBC_MINOR__ 6
Что в мойм случае соотвествует glibc-2.6.*

Цитата Сообщение от lemegeton Посмотреть сообщение
В теории, скорость выделения памяти и там и там должна быть одинаковой, это не жесткий диск и алгоритмы в обеих ОС достаточно схожие
В том-то и дело, что ОС там работает по минимуму. malloc обычно сразу отхапает, например, 4 мегабайта памяти, а потом самостоятельно в этих 4 мегабайтах выделяет память на каждый пользовательский запрос (с тем, чтобы уменьшить количество обращений к ОС). Под linux'ом есть два механизма выделения памяти: brk и mmap. malloc от разной версии glibc может работать разными алгортимами и на одном и том же тесте на разных версиях glibc можно получить большой разброс на одной и той же конфигурации машины

Цитата Сообщение от lemegeton Посмотреть сообщение
Скорость выделения памяти должна иметь зависимость от выделяемого объема и не отличаться в скорости выделения на байт информации при выделении больших или меньших объемов
От объёмов зависит алгоритм того, как malloc нарезает эти куски из заранее попрошенного у системы большого куска памяти

Цитата Сообщение от lemegeton Посмотреть сообщение
С VC вы, возможно, правы. В общем случае он создает более эффективный код, чем gcc. У них ведь есть fastcall
fastcall, насколько я знаю, немного меняет программные соглашения по вызовам, чтобы побольше параметров передавать на регистрах и поменьше на стеке. Это даёт выигрыш в единицы или десятки тактов (в зависимости от того, как мы там попадём в кэш при обращении в память). fastcall даёт ускорение в десятые или сотые доли процента на всём приложении в целом. Но никак не 10-20%, как втвоём эксперименте

Ещё один момент память нужно не только выделать, но и обращаться к ней. В linux'е, насколько я знаю, при выделении новой страницы памяти она оказывается невалидной (т.е. в TLB она есть, но в физпамять ещё не попала). В винде это может быть по другому (т.е. страница может сразу попадать в память). Если ты сделаешь обращение в память, то гарантированно поставишь исполнение на разных осях в одинаковые условия

Добавлено через 2 минуты
Вот ещё. Все времена сначала складывай в массив, а в конце массив уже распечатывай. Чтобы время работы printf'а не влияло на результат. Ещё напечатй разницу между итерациями i и i-1, чтобы видеть, тормоза идут равномерно или нет
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
10.01.2011, 15:56  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Что означает "версия отсутсвует?"
Естественно, отсутствуют библиотеки.

Цитата Сообщение от Evg Посмотреть сообщение
Ещё один момент память нужно не только выделать, но и обращаться к ней. В linux'е, насколько я знаю, при выделении новой страницы памяти она оказывается невалидной (т.е. в TLB она есть, но в физпамять ещё не попала). В винде это может быть по другому (т.е. страница может сразу попадать в память).
В винде то же самое, но ради искусства...

Думаю, достаточно будет записать первый и последний байт выделенной памяти.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]) {
  char *memory = NULL;
 
  for (int i = 0; i < 2048; i += 64) {
    clock_t start_ = clock();
    int operation_count = 10240;
    for (int j = 0; j < operation_count; ++j) {
      memory = (char*)malloc(1024 * 1024 * i);
      memory[0] = 0;
      memory[1024 * 1024 * i - 1] = 0;
      free(memory);
    }
    printf("Allocated %d times %d megabytes in %f sec.\n", operation_count,
           i, ((double)(clock() - start_) / CLOCKS_PER_SEC));
  }
 
  int key;
  scanf("%d", &key);
  return 0;
}
VS
Allocated 10240 times 0 megabytes in 0.015000 sec.
Allocated 10240 times 64 megabytes in 0.282000 sec.
Allocated 10240 times 128 megabytes in 0.328000 sec.
Allocated 10240 times 192 megabytes in 0.344000 sec.
Allocated 10240 times 256 megabytes in 0.375000 sec.
Allocated 10240 times 320 megabytes in 0.359000 sec.
Allocated 10240 times 384 megabytes in 0.453000 sec.
Allocated 10240 times 448 megabytes in 0.406000 sec.
Allocated 10240 times 512 megabytes in 0.485000 sec.
Allocated 10240 times 576 megabytes in 0.484000 sec.
Allocated 10240 times 640 megabytes in 0.516000 sec.
Allocated 10240 times 704 megabytes in 0.547000 sec.
Allocated 10240 times 768 megabytes in 0.625000 sec.
Allocated 10240 times 832 megabytes in 0.656000 sec.
Allocated 10240 times 896 megabytes in 0.609000 sec.
Allocated 10240 times 960 megabytes in 0.656000 sec.
Allocated 10240 times 1024 megabytes in 0.672000 sec.
Allocated 10240 times 1088 megabytes in 0.688000 sec.
Allocated 10240 times 1152 megabytes in 0.719000 sec.
Allocated 10240 times 1216 megabytes in 0.765000 sec.
Allocated 10240 times 1280 megabytes in 0.766000 sec.
Allocated 10240 times 1344 megabytes in 0.797000 sec.
Allocated 10240 times 1408 megabytes in 0.890000 sec.
Allocated 10240 times 1472 megabytes in 0.891000 sec.
Allocated 10240 times 1536 megabytes in 0.953000 sec.
Allocated 10240 times 1600 megabytes in 0.953000 sec.
Allocated 10240 times 1664 megabytes in 1.000000 sec.
Allocated 10240 times 1728 megabytes in 1.015000 sec.
Allocated 10240 times 1792 megabytes in 1.016000 sec.
Allocated 10240 times 1856 megabytes in 1.094000 sec.
Allocated 10240 times 1920 megabytes in 1.078000 sec.
На последнем выделении упал с неверным обращением.

Windows, GCC.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Allocated 10240 times 0 megabytes in 0.015000 sec.
Allocated 10240 times 64 megabytes in 0.313000 sec.
Allocated 10240 times 128 megabytes in 0.328000 sec.
Allocated 10240 times 192 megabytes in 0.359000 sec.
Allocated 10240 times 256 megabytes in 0.360000 sec.
Allocated 10240 times 320 megabytes in 0.437000 sec.
Allocated 10240 times 384 megabytes in 0.406000 sec.
Allocated 10240 times 448 megabytes in 0.469000 sec.
Allocated 10240 times 512 megabytes in 0.484000 sec.
Allocated 10240 times 576 megabytes in 0.500000 sec.
Allocated 10240 times 640 megabytes in 0.531000 sec.
Allocated 10240 times 704 megabytes in 0.578000 sec.
Allocated 10240 times 768 megabytes in 0.609000 sec.
Allocated 10240 times 832 megabytes in 0.657000 sec.
Allocated 10240 times 896 megabytes in 0.640000 sec.
Allocated 10240 times 960 megabytes in 0.703000 sec.
Allocated 10240 times 1024 megabytes in 0.657000 sec
Allocated 10240 times 1088 megabytes in 0.750000 sec
Allocated 10240 times 1152 megabytes in 0.735000 sec
Allocated 10240 times 1216 megabytes in 0.750000 sec
Allocated 10240 times 1280 megabytes in 0.797000 sec
Allocated 10240 times 1344 megabytes in 0.828000 sec
Allocated 10240 times 1408 megabytes in 0.843000 sec
Allocated 10240 times 1472 megabytes in 0.891000 sec
Allocated 10240 times 1536 megabytes in 0.906000 sec
Allocated 10240 times 1600 megabytes in 0.953000 sec
Allocated 10240 times 1664 megabytes in 1.015000 sec
Allocated 10240 times 1728 megabytes in 1.032000 sec
Allocated 10240 times 1792 megabytes in 1.062000 sec
Allocated 10240 times 1856 megabytes in 1.078000 sec
Конец обеда приснился раньше.

Ща загружусь в линукс.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2011, 15:59
Цитата Сообщение от lemegeton Посмотреть сообщение
Думаю, достаточно будет записать первый и последний байт выделенной памяти
Нет. Надо записать по одному байту на каждую из страниц (т.е. от перовго с интервалом в 4килобайта)
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
10.01.2011, 16:06  [ТС]
Оно уже медленней работает.
Линукс, ГЦЦ.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Allocated 10240 times 0 megabytes in 0.000000 sec.
Allocated 10240 times 64 megabytes in 0.320000 sec.
Allocated 10240 times 128 megabytes in 0.330000 sec.
Allocated 10240 times 192 megabytes in 0.330000 sec.
Allocated 10240 times 256 megabytes in 0.320000 sec.
Allocated 10240 times 320 megabytes in 0.340000 sec.
Allocated 10240 times 384 megabytes in 0.340000 sec.
Allocated 10240 times 448 megabytes in 0.360000 sec.
Allocated 10240 times 512 megabytes in 0.350000 sec.
Allocated 10240 times 576 megabytes in 0.360000 sec.
Allocated 10240 times 640 megabytes in 0.370000 sec.
Allocated 10240 times 704 megabytes in 0.370000 sec.
Allocated 10240 times 768 megabytes in 0.380000 sec.
Allocated 10240 times 832 megabytes in 0.380000 sec.
Allocated 10240 times 896 megabytes in 0.390000 sec.
Allocated 10240 times 960 megabytes in 0.390000 sec.
Allocated 10240 times 1024 megabytes in 0.410000 sec.
Allocated 10240 times 1088 megabytes in 0.410000 sec.
Allocated 10240 times 1152 megabytes in 0.400000 sec.
Allocated 10240 times 1216 megabytes in 0.430000 sec.
Allocated 10240 times 1280 megabytes in 0.410000 sec.
Allocated 10240 times 1344 megabytes in 0.440000 sec.
Allocated 10240 times 1408 megabytes in 0.430000 sec.
Allocated 10240 times 1472 megabytes in 0.430000 sec.
Allocated 10240 times 1536 megabytes in 0.440000 sec.
Allocated 10240 times 1600 megabytes in 0.460000 sec.
Allocated 10240 times 1664 megabytes in 0.450000 sec.
Allocated 10240 times 1728 megabytes in 0.470000 sec.
Allocated 10240 times 1792 megabytes in 0.460000 sec.
Allocated 10240 times 1856 megabytes in 0.480000 sec.
Allocated 10240 times 1920 megabytes in 0.470000 sec.
Allocated 10240 times 1984 megabytes in 0.490000 sec.
Добавлено через 3 минуты
пиши софтину, которая тебя устроит.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2011, 16:15
Ой... у тя пишет время на каждую итерацию отдельно. А я что-то подумал, что это суммарное время (это к тому, когда я просил писать разницу между i и i-1)

Добавлено через 6 минут
Цитата Сообщение от lemegeton Посмотреть сообщение
пиши софтину, которая тебя устроит
Сделал так, чтобы запись в память была хотя бы раз в каждую страницу - сразу начало чувствоваться изменение хода работы. Теперь operation_count = 10 (а не 10 тыщ), потому что пошли реальные процессы подкачки страницы в память. Ща результат покажу
0
 Аватар для Vermis
1 / 1 / 0
Регистрация: 08.12.2010
Сообщений: 99
10.01.2011, 16:17
Предлагаю на асме сделать тоже самое, раз уж вас компиляторы смущают.

P.S. я только предлагаю
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
10.01.2011, 16:20  [ТС]
Vermis, код в студию. )))

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Сделал так, чтобы запись в память была хотя бы раз в каждую страницу - сразу начало чувствоваться изменение хода работы. Теперь operation_count = 10 (а не 10 тыщ), потому что пошли реальные процессы подкачки страницы в память. Ща результат покажу
И шажок можно поменьше сделать.
Жду код. )
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2011, 16:27
Цитата Сообщение от Vermis Посмотреть сообщение
Предлагаю на асме сделать тоже самое, раз уж вас компиляторы смущают.
Смущают не компиляторы, а баблиотека, в которой реализован malloc

Добавлено через 1 минуту
Если модераторы тут, то с поста #3035 хорошо бы выделить в отдельную тему "Замеры скорости работы malloc'а на Windows и Linux"

Добавлено через 3 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
int
main (int argc, char *argv[])
{
  char *memory;
  double t, total;
  int i, j, k;
 
  t = 0;
 
  for (i = 0; i < 2048; i += 64)
  {
    clock_t start_ = clock();
    int operation_count = 10;
    long count = 1024 * 1024 * i;
 
    for (j = 0; j < operation_count; ++j)
    {
      memory = (char*)malloc(count);
 
      for (k = 0; k < count; k += 4096 /* page size */)
        memory[k] = k;
 
      free(memory);
    }
 
    t = (double)(clock() - start_) / CLOCKS_PER_SEC;
    printf("Allocated %d times %d megabytes in %f sec.\n", operation_count, i, t);
    total += t;
  }
 
  printf ("total = %f\n", total);
 
  return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ gcc t.c -static -O2
$ /usr/bin/time ./a.out
Allocated 10 times 0 megabytes in 0.000000 sec.
Allocated 10 times 64 megabytes in 0.560000 sec.
Allocated 10 times 128 megabytes in 1.140000 sec.
Allocated 10 times 192 megabytes in 1.710000 sec.
Allocated 10 times 256 megabytes in 2.290000 sec.
Allocated 10 times 320 megabytes in 2.840000 sec.
Allocated 10 times 384 megabytes in 3.440000 sec.
Allocated 10 times 448 megabytes in 3.990000 sec.
Allocated 10 times 512 megabytes in 4.530000 sec.
Allocated 10 times 576 megabytes in 5.120000 sec.
Allocated 10 times 640 megabytes in 5.690000 sec.
Allocated 10 times 704 megabytes in 6.250000 sec.
Allocated 10 times 768 megabytes in 6.830000 sec.
Allocated 10 times 832 megabytes in 7.380000 sec.
Allocated 10 times 896 megabytes in 7.950000 sec.
Allocated 10 times 960 megabytes in 8.500000 sec.
Allocated 10 times 1024 megabytes in 9.080000 sec.
Allocated 10 times 1088 megabytes in 9.660000 sec.
Allocated 10 times 1152 megabytes in 10.210000 sec.
Allocated 10 times 1216 megabytes in 10.780000 sec.
Allocated 10 times 1280 megabytes in 11.450000 sec.
Allocated 10 times 1344 megabytes in 11.990000 sec.
Allocated 10 times 1408 megabytes in 12.570000 sec.
Allocated 10 times 1472 megabytes in 13.120000 sec.
Allocated 10 times 1536 megabytes in 13.540000 sec.
Allocated 10 times 1600 megabytes in 14.180000 sec.
Allocated 10 times 1664 megabytes in 14.690000 sec.
Allocated 10 times 1728 megabytes in 15.360000 sec.
Allocated 10 times 1792 megabytes in 15.880000 sec.
Allocated 10 times 1856 megabytes in 16.490000 sec.
Allocated 10 times 1920 megabytes in 17.090000 sec.
Allocated 10 times 1984 megabytes in 17.780000 sec.
total = 280.094839
16.62user 265.47system 5:05.95elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+81264729minor)pagefaults 0swaps
Времянка (выдача от утилиты time) показывает 16 секунд пользовательского времени (которое провели внутри a.out) и 265 секунд системного времени (которое провели внутри ядра). Т.е. про тест можно сказать, что он "чистый" (т.е. более 90% времени торчали в ядре). Хорошо бы такое же соотношение в винде увидеть, но я не знаю как

В любом случае сравнивать на винде и линухе надо на одной и той же машине

Добавлено через 54 секунды
память (выдача по top) у меня такая:

Code
1
2
Mem:   3246384k total,  1125644k used,  2120740k free,      128k buffers
Swap:  9759280k total,  1356936k used,  8402344k free,   319136k cached
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
10.01.2011, 16:42  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
В любом случае сравнивать на винде и линухе надо на одной и той же машине
Естественно, мы меряем в попугаях, естественно, тут будет замешан еще и менеджер процессов, естественно, "чистых" результатов не будет. Но будут относительные результаты в более-менее боевых условиях.

Обзавидовался вашей машине, трусливо уменьшил максимальный выделенный кусок до 512Мб.
Linux:
Code
1
2
3
4
5
6
7
8
9
10
Allocated 10 times 0 megabytes in 0.000000 sec.
Allocated 10 times 64 megabytes in 1.070000 sec.
Allocated 10 times 128 megabytes in 2.150000 sec.
Allocated 10 times 192 megabytes in 3.220000 sec.
Allocated 10 times 256 megabytes in 4.300000 sec.
Allocated 10 times 320 megabytes in 5.350000 sec.
Allocated 10 times 384 megabytes in 6.480000 sec.
Allocated 10 times 448 megabytes in 7.490000 sec.
Allocated 10 times 512 megabytes in 8.560000 sec.
total = 38.620000
Дальше ждать уже лениво, а на винде, небось, в своп сваливаться будет. Ща перегружусь.

Добавлено через 1 минуту
Top-память.
Code
1
2
Mem:   1015904k total,   626416k used,   389488k free,    63488k buffers
Swap:  1951740k total,        0k used,  1951740k free,   298236k cached
0
Evg
10.01.2011, 16:51

Не по теме:

Цитата Сообщение от lemegeton Посмотреть сообщение
Обзавидовался вашей машине
Щас память копейки стоит

0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
10.01.2011, 17:33  [ТС]
Неожиданнейший результат. На винде работает... барабанная дробь... быстрее.
Однако, нестабильно, дает все время разные результаты, иногда на 512Мб непонятно с какой причины лезет в своп, и какая-то беда со счетчиком.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Allocated 10 times 0 megabytes in 0.000000 sec.
Allocated 10 times 64 megabytes in 0.562000 sec.
Allocated 10 times 128 megabytes in 1.203000 sec.
Allocated 10 times 192 megabytes in 2.047000 sec.
Allocated 10 times 256 megabytes in 2.703000 sec.
Allocated 10 times 320 megabytes in 3.312000 sec.
Allocated 10 times 384 megabytes in 3.969000 sec.
Allocated 10 times 448 megabytes in 4.703000 sec.
Allocated 10 times 512 megabytes in 5.234000 sec.
total = 188116292957488840000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000.000000
Добавлено через 8 минут
После запуска теста на винде пришлось ребутнуть машину. Работать дальше стало невозможно. Либо код протекает, либо что-то менеджер памяти крутое там делает.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2011, 17:35
Цитата Сообщение от lemegeton Посмотреть сообщение
Неожиданнейший результат
Такой результат не должен быть неожиданностью. Linux всё-таки многоплатформенная система, а написать, чтобы везде было хорошо куда сложнее, чем написать, чтобы было хорошо только на одном процессоре. Думаю, что под виндой ещё и более детально отписаны коды под разные типы процессора, чипсеты, контроллеры памяти и т.п. (когда кодтолько под одну систему, то можно себе такое позволить)

Цитата Сообщение от lemegeton Посмотреть сообщение
Однако, нестабильно, дает все время разные результаты
Тогда для порядку надо делать несколько подряд запусков на линуксе и несколько подряд на винде. На всякий пожарный на винде померить на gcc и на MSVC

Цитата Сообщение от lemegeton Посмотреть сообщение
и какая-то беда со счетчиком
Какая-какая? Проинициализировать забыл, вот какая

Добавлено через 1 минуту
Цитата Сообщение от lemegeton Посмотреть сообщение
После запуска теста на винде пришлось ребутнуть машину. Работать дальше стало невозможно. Либо код протекает, либо что-то менеджер памяти крутое там делает
А это уже пахнет кривостью винды. После завершения процесса память должна освобождаться.

Добавлено через 27 секунд
Цитата Сообщение от lemegeton Посмотреть сообщение
иногда на 512Мб непонятно с какой причины лезет в своп
Всмысле диск шуршит или как определяешь?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
10.01.2011, 17:52  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Такой результат не должен быть неожиданностью. Linux всё-таки многоплатформенная система, а написать, чтобы везде было хорошо куда сложнее, чем написать, чтобы было хорошо только на одном процессоре. Думаю, что под виндой ещё и более детально отписаны коды под разные типы процессора, чипсеты, контроллеры памяти и т.п. (когда кодтолько под одну систему, то можно себе такое позволить)
В принципе, логично.

Цитата Сообщение от Evg Посмотреть сообщение
Тогда для порядку надо делать несколько подряд запусков на линуксе и несколько подряд на винде.
Делал. ) На винде погрешность в пределах 0.2 секунды (после третьего запуска приходится ребутать ОС), на линуксе в пределах 0.001, что можно смело списать на систему ввода/вывода или время переключения задачи.

Цитата Сообщение от Evg Посмотреть сообщение
Какая-какая? Проинициализировать забыл, вот какая
А я даже копать не стал, ребутаться уже надоедает. )))

Цитата Сообщение от Evg Посмотреть сообщение
После завершения процесса память должна освобождаться.
Память выглядит как освобожденная (в менеджере процессов значение возвращается на исходное), но при попытке запустить любое другое приложение лезет в своп.

Цитата Сообщение от Evg Посмотреть сообщение
Всмысле диск шуршит или как определяешь?
Диск шуршит тоже индикатор. ))) По менеджеру процессов видно, как размер свопа дрыгается, а вот обращение к свопу проще по "диск шуршит" определять. )

Да и пусть его, только он иногда в своп лезет, когда памяти еще есть. Вот это уже странней. Очень похоже, что менеджер памяти винды увеличивает производительность работы со страничной памятью, методом болтоукладки на фрагментацию этой самой памяти. Либо он оставляет "освобожденную" память некоторое время закрепленной за приложением.

Литературку бы какую по менеджеру памяти виндоуз, чтобы не гадать на кофейной гуще.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2011, 23:26
Цитата Сообщение от lemegeton Посмотреть сообщение
Память выглядит как освобожденная (в менеджере процессов значение возвращается на исходное), но при попытке запустить любое другое приложение лезет в своп.
Теоретически отсвопилась память в том числе и от системных процессов. Интересно было бы поэкспериментировать на предмет того, вернётся оно в нормальное безтормозное состояние (мне кажется, что вернётся) и если вернётся, то сколько времени пройдёт

Добавлено через 3 часа 34 минуты
(to модераторы)
Просьба перенести тему в раздел "Теория и технологии программирования "

Тема не является холиваром. В теме показаны два способа сравнения одного и того же показателя. "Правильный" и "неправильный" подходы к измерению показали два совершенно разных результата. Думаю, это может оказаться полезным, особенно новичкам. Справедливости ради надо сказать, что оба подхода не претендуют на полноту, потому как являются искусственными примерами, а не реальными задачами. А потому, как и любой бенчмарк, данный результат попадает под категорию "статистика", а потому его не следует понимать, как истину в последней инстанции.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.01.2011, 23:49
Evg, Дождался до 700+ мб и прекратил выполнение MSVS 2008. Минут 5 комп нервно подтормаживал, затем пришел в норму.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Allocated 10 times 0 megabytes in 0.000000 sec.
Allocated 10 times 64 megabytes in 1.203000 sec.
Allocated 10 times 128 megabytes in 2.453000 sec.
Allocated 10 times 192 megabytes in 3.625000 sec.
Allocated 10 times 256 megabytes in 4.812000 sec.
Allocated 10 times 320 megabytes in 6.016000 sec.
Allocated 10 times 384 megabytes in 7.859000 sec.
Allocated 10 times 448 megabytes in 8.766000 sec.
Allocated 10 times 512 megabytes in 9.719000 sec.
Allocated 10 times 576 megabytes in 11.125000 sec.
Allocated 10 times 640 megabytes in 12.015000 sec.
Allocated 10 times 704 megabytes in 13.907000 sec.
Allocated 10 times 768 megabytes in 28.656000 sec.
Интересно почему такой разрыв во времени между 704 и 768. На 800+ в прошлый раз показало вообще больше минуты.
+ В первый запуск (часа два назад) все было закономерно кроме 512. На 512 показывал время которое совершенно выбивалось из графика. Что-то вроде секунд 30
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2011, 23:55
А памяти на машине сколько? И сколько свопа? Возможно, как-то с этим связано
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.01.2011, 23:59
Evg, М... Извиняюсь, но вот в этом я точно новичек) Как посмотреть?)
Если в диспетчере задач - то вот:
Code
1
2
3
4
5
6
7
8
9
Физ. память:
Всего - 1046956
Доступно - 793056
Кэш - 89860
 
Выделение памяти:
Всего - 445732
Предел - 2519748
Пик - 1379720
Командой mem в консоли:


Code
1
2
3
4
5
6
7
8
    655360 байт - всего обычной памяти
    655360 байт - доступно для MS-DOS
    632880 максимальный размер исполняемой программы
 
   1048576 байт - всего непрерывной дополнительной памяти
         0 байт - доступно непрерывной дополнительной памяти
    941056 байт - доступной памяти XMS
           резидентная часть MS-DOS загружена в сегмент HMA
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.01.2011, 00:30  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
"Правильный" и "неправильный" подходы к измерению показали два совершенно разных результата.
Скорее это были замеры разных вещей. Первый предложенный мной вариант измерял исключительно системный вызов. Без физического выделения памяти.

Цитата Сообщение от ForEveR Посмотреть сообщение
Интересно почему такой разрыв во времени между 704 и 768. На 800+ в прошлый раз показало вообще больше минуты.
Не надо с гигабайтом памяти пытаться столько выделить, времени много уходит.

Цитата Сообщение от ForEveR Посмотреть сообщение
В первый запуск (часа два назад) все было закономерно кроме 512. На 512 показывал время которое совершенно выбивалось из графика.
Вот у меня тоже такая история. Рандомно (скорее я не вижу закономерности) начинает лезть в свап, когда памяти еще достаточно.

Цитата Сообщение от ForEveR Посмотреть сообщение
Минут 5 комп нервно подтормаживал, затем пришел в норму.
Мой виндоуз притормаживал чуть подольше. Минут десять. После трех запусков такого теста из "притормаживаний" за двадцать минут не вышел -- я ребутнул машину. У меня нэтбук с 1Гб озу, слабая машина.

Кстати о птичках. Программа не учитывает, что размер страницы памяти может отличаться от 4Кб в зависимости от системы. Надо бы это пофиксить.

Покамест мы имеем, что системный вызов в линуксе выполняется быстрее, но сама работа со страничной памятью в виндоуз выполняется эффективней. Правда, в виндоуз имеем некоторые галлюцинации по завершению программы.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.01.2011, 09:41
Цитата Сообщение от lemegeton Посмотреть сообщение
Скорее это были замеры разных вещей. Первый предложенный мной вариант измерял исключительно системный вызов. Без физического выделения памяти.
Когда собираешься мерить одно, но реально мерится другое - это всё-таки "неправильный" тест. Поэтому глядя только на опубликованные цифры и не зная, что конкретно и мерилось и какой методикой, эти цифры остаются только цифрами

Цитата Сообщение от lemegeton Посмотреть сообщение
Кстати о птичках. Программа не учитывает, что размер страницы памяти может отличаться от 4Кб в зависимости от системы. Надо бы это пофиксить
Размер страницы - это свойство процессора (т.е. аппаратное). Я знаю, что на intele оно равно 4 килобайтам. Реально есть какая-то библиотечная функция типа pagesize, которая возвращает нужное значение, но толком не помню, как оно называется и не знаю, есть ли на windows

Цитата Сообщение от lemegeton Посмотреть сообщение
Покамест мы имеем, что системный вызов в линуксе выполняется быстрее, но сама работа со страничной памятью в виндоуз выполняется эффективней. Правда, в виндоуз имеем некоторые галлюцинации по завершению программы
Скорость работы системного вызова - это тот параметр, который можно показать для статистики, но сам по себе он мало кому интересен. Интересно лишь то, как системный вызов плюс реальная подкачка страницы в память будет совместно работать на реальном приложении. Глядя на полученный результат я не берусь утверждать, что что-то в линуксе или windows работает лучше. Разработчики вполне могли отлаживать в первую очередь те режимы работы, которые приближены к реальным задачам, а наш пример - слишком искусственный.

Цитата Сообщение от ForEveR Посмотреть сообщение
Evg, М... Извиняюсь, но вот в этом я точно новичек) Как посмотреть?)
Всего - 1046956
Предел - 2519748

Видимо, сие означает, что физической памяти гиг, а предельно допустимое использование - 2.5 гига (т.е. 1.5 гига на файл подкачки). Но, думаю, это ограничение для одной задачи, а не не всю систему. Под виндой я всего лишь домохозяйка, так что даже не знаю, как смотреть

Добавлено через 1 минуту
Но у тебя есть параметр "Доступно - 793056". И как раз в районе этой цифры образовался скачок. Видимо с этого момента вся доступная физ память загадилась и полезли на диск
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2011, 09:41
Помогаю со студенческими работами здесь

Установка Qt на Linux для кросс-компиляции: Linux 32/64 Windows 32/64
В силу объективных причин пришлось перейти на Linux, но столкнулся с проблемой установки окружения Qt. Нужна установка Qt на Linux Mint для...

Сравнение скорости работы Qt и C++
Добрый вечер, коллеги. В одном из моих проектов используется плата Raspberry Pi. Данный миникомпьютер выполняет роль IP-камеры. Клиентская...

Увеличение скорости работы бд
Хотелось бы узнать, какие есть методы по увеличению скорости работы бд? или хотя бы просто &quot;как&quot; лучше создавать архитектуру, для...

Изменение скорости работы COM порта
Приветствую всех. Занялся я, значит, созданием программы для работы с физическим устройством. Сие устройство &quot;общается&quot; по ГОСТ...

Увеличение скорости работы программы
Всем привет ребят. Пишу программу для разложения числа(на определенные множители). Надо работать с большими числами используя библиотеку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru