Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
31 / 40 / 6
Регистрация: 04.10.2014
Сообщений: 185

Скорость чтения массива по "колонкам" ?

08.08.2019, 19:33. Показов 2115. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как быстрее?

Так >>
C++
1
2
3
4
5
int n[4][3]{1,2,3, 4,5,6, 7,8,9, 0,1,2};
for (int r = 0; r < 4; r++)
{
    n[r][2];
}
Или так >>
C++
1
2
3
4
5
6
7
int n[4][3]{1,2,3, 4,5,6, 7,8,9, 0,1,2};
int* pn = &n[0][0] - 1;
for (int d = 0; d < 4; d++)
{
    pn += 3;
    *pn;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2019, 19:33
Ответы с готовыми решениями:

Создание тестов на скорость чтения и скорость записи
Проблемка такая - пишу простенький тест на скорость записи и скорость чтения, локальных и съемных дисков. Как написать тесты вроде...

Так ли важна в реальной жизни скорость записи SSD, или смотреть надо только на скорость чтения, а на запись пофигу
https://www.citilink.ru/catalog/computers_and_notebooks/hdd/ssd_in/420250/ вот у него скорость записи низкая, но он самый популярный

При тестировании скорости чтения и записи на ПЗУ, скорость чтения больше скорости записи
Требовалось написать программу определения производительности жесткого диска (чтение/запись). Написал следующий код:using System; using...

16
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.08.2019, 21:49
Хотелось бы верить что при включенных оптимизациях оба варианта сгенерируют абсолютно идентичный код. А так, второй вариант выглядит перспективнее.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.08.2019, 21:51
Цитата Сообщение от Redee Посмотреть сообщение
Как быстрее?
Так >>
По строкам быстрее - ты читаешь непрерывную область памяти, соответственно процессор может её нормально закэшировать. Когда по столбцам - то обращаешься к разным участкам памяти, и процессору приходится постоянно перезагружать кэш.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.08.2019, 21:53
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
По строкам быстрее - ты читаешь непрерывную область памяти, соответственно процессор может её нормально закэшировать.
У него там pn+=3. То есть оба варианта - чтение перепрыгивая три ячейки.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.08.2019, 21:57
Цитата Сообщение от Renji Посмотреть сообщение
У него там pn+=3. То есть оба варианта - чтение перепрыгивая три ячейки.
Ну да, не обратил внимания
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
09.08.2019, 18:55
Redee,
вот вам тест:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
///----------------------------------------------------------------------------|
/// Стенд для замера количество тактов на каждом из двух участков кода.
/// Делается 1000 000 000 проходов для каждого участка.
/// Выбирается только лучший(меньшее количество тактов) результат.
///----------------------------------------------------------------------------:
#include <stdio.h>
#include <conio.h>
 
///----------------------------------------------------------------------------|
/// Мерилка тактов проца.
///----------------------------------------------------------------------------:
typedef unsigned long long ull;
inline ull rdtsc()
{   
#ifdef __BORLANDC__ 
#endif
 
#ifdef _MSC_VER
    unsigned clock = 0;
    __asm rdtsc;
    __asm mov[clock], eax;
    return clock;
#endif
 
#ifdef __GNUC__
    unsigned int lo, hi;
    asm volatile ("rdtsc\n" : "=a" (lo), "=d" (hi));
    return ((ull)hi << 32) | lo;
#endif
}
 
 
///----------------------------------------------------------------------------|
/// Для удобства.
///----------------------------------------------------------------------------:
#define START_PERFOMANCE  ull t1 = rdtsc(); static ull ss_  = 0xffffffff;\
    bool b = false
#define END_PERFOMANCE ull v  = rdtsc(); v -= t1;\
    if(ss_ > v){ b = true; ss_ = v;}
 
///----------------------------------------------------------------------------|
/// variant_1.
///----------------------------------------------------------------------------:
ull variant_1()
{   int nw = 0;
 
START_PERFOMANCE;//=============================//
int n[4][3]{1,2,3, 4,5,6, 7,8,9, 0,1,2};
for (int r = 0; r < 4; r++)
{
    n[r][2];
}
END_PERFOMANCE;//===============================//
 
    if(b)
    {   printf ("variant_1: ");
        printf ("%10u \n",  (unsigned)ss_);
        b = false;
    }
 
    return ss_;
}
 
///----------------------------------------------------------------------------|
/// variant_2.
///----------------------------------------------------------------------------:
ull variant_2()
{   int  nw = 0;
 
START_PERFOMANCE;//=================================================//
int n[4][3]{1,2,3, 4,5,6, 7,8,9, 0,1,2};
int* pn = &n[0][0] - 1;
for (int d = 0; d < 4; d++)
{
    pn += 3;
    *pn;
}
END_PERFOMANCE;//===================================================//
 
    if(b)
    {   printf ("variant_2: ");
        printf ("%10u \n",  (unsigned)ss_);
        b = false;
    }
 
    return ss_;
}
 
///----------------------------------------------------------------------------|
/// Start.
///----------------------------------------------------------------------------:
int main()
{   ull m,c;
 
    //-------------------------------|
    // Quiet, testing!               |
    //-------------------------------:
    for(int i = 0; i < 1000000000; ++i)
    {   c = variant_1();
        m = variant_2();
    }
 
    //-------------------------------|
    // Banners is redy...            |
    //-------------------------------:
    const char* str[] = {"WIN <<<--!!!", "looser...", "friendship won!"};
    int i1, i2;
    (m > c) ? (i1 = 0, i2 = 1) : 
              ((m == c)?(i1 = 2, i2 = 2) : (i1 = 1, i2 = 0));
 
    //-------------------------------|
    // Finish result.                |
    //-------------------------------:
    printf ("\nFinish the race-------------------:\n");
    printf ("variant_1: %u - ", (unsigned)c);
    printf ("%s\n", str[i1]);
    printf ("variant_2: %u - ", (unsigned)m);
    printf ("%s\n", str[i2]);
 
    //-------------------------------|
    // Show efficiency.              |
    //-------------------------------:
    double ef = 100.0/double(c) * double(m) - 100.0;
    printf ("\nProfitable variant_1: %2.2f%%\n\n",  ef);
 
    //_getch();
    return 0;
}
GCC 8.2

Как видите: ПОБЕДИЛА ДРУЖБА.
1
31 / 40 / 6
Регистрация: 04.10.2014
Сообщений: 185
09.08.2019, 19:12  [ТС]
Так собственно какой "заяц" шустрее и чей "удельный вес" тяжелее ?

C++
1
n[r][2];
или
C++
1
2
pn += 3;
*pn;
Добавлено через 52 секунды
XLAT в принципе да можно затестить практическим путем так сказать )).

Добавлено через 12 минут
В 1ом - разименовывание 2ва раза.
Во 2ом - сложение, присваивание, разименовывание - 3 операции.
Прошу не пинать - просто досконально разобраться хочется ).

Само разименовывание как там процессором обрабатывается то ?
К началу адреса прибавляется "индекс", а потом разименовывание ?

C++
1
2
3
n[r];
// то есть равнозначно ЛИ можно записать и так ?
*(&n + r)
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
09.08.2019, 19:31
Цитата Сообщение от Redee Посмотреть сообщение
К началу адреса прибавляется "индекс", а потом разименовывание ?
вы можете как угодно интерпретировать текст того кода, что вы написали,
а компилятор будет переводить ваш код так, как пожелали ему делать бородатые погромисты - отцы и матери используемого вами компилятора.

вот еще пару тестов того же самого:
на GCC 4.9.2 32-bit

на GCC 4.9.2 64-bit
1
31 / 40 / 6
Регистрация: 04.10.2014
Сообщений: 185
09.08.2019, 20:11  [ТС]
Благодарю за тесты, вот я такие не умею писать )).
Попытался нагородить "огороды", но НЕ замерило )). Выбило в наносекундах чистый нУль ).

C++
1
2
3
4
5
6
7
8
9
10
11
int n[100200300][3];
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
for (int r = 0; r < 100200300; r++)
{
    n[r][2];
}
end = std::chrono::system_clock::now();
std::cout <<
    std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count()
<< std::endl;
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.08.2019, 20:28
Цитата Сообщение от Redee Посмотреть сообщение
Благодарю за тесты, вот я такие не умею писать )).
Попытался нагородить "огороды", но НЕ замерило )). Выбило в наносекундах чистый нУль ).
В релизе? Ну а что ты хочешь, компилятор просто соптимизировал этот цикл в ноль, за ненадобностью.
0
31 / 40 / 6
Регистрация: 04.10.2014
Сообщений: 185
09.08.2019, 21:11  [ТС]
Что Debug, что Release под визуалкой.
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
09.08.2019, 21:20
Лучший ответ Сообщение было отмечено Redee как решение

Решение

Redee,
вот так попробуйте:
C++
1
2
3
4
for (int r = 0; r < 100200300; r++)
{
    n[r][2] = r;
}
1
31 / 40 / 6
Регистрация: 04.10.2014
Сообщений: 185
09.08.2019, 22:49  [ТС]
Да помогло, только надо еще увеличить размер стека через >>

C++
1
#pragma comment(linker, "/STACK:число_байт")
Ща замерим.

Добавлено через 15 минут
2ой вариант оказался немного быстрее.
Если в 1ом замеры варьируются от 32 до 36 миллисекунд.
То во 2ом от 31 до 33 миллисекунд.

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
int n[100200300][3];
std::chrono::time_point<std::chrono::system_clock> start, end;
for (int d = 0; d < 10; d++)
{
    start = std::chrono::system_clock::now();
    for (int r = 0; r < 100200300; r++)
    {
        n[r][2] = r;
    }
    end = std::chrono::system_clock::now();
    __int64 result = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    std::cout << result << " ";
}
std::cout << std::endl;
 
int* pn = &n[0][0] - 1;
for (int d = 0; d < 10; d++)
{
    start = std::chrono::system_clock::now();
    for (int r = 0; r < 100200300; r++)
    {
        pn += 3;
        *pn = r;
    }
    end = std::chrono::system_clock::now();
    __int64 result = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    std::cout << result << " ";
}
std::cout << std::endl;
1
31 / 40 / 6
Регистрация: 04.10.2014
Сообщений: 185
09.08.2019, 22:51  [ТС]
Консоль >>
Миниатюры
Скорость чтения массива по "колонкам" ?  
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
09.08.2019, 22:55
А профайлером проверить религия не позволяет? Зачем для этой задачи писать тесты?
0
31 / 40 / 6
Регистрация: 04.10.2014
Сообщений: 185
09.08.2019, 23:08  [ТС]
Так что 2ой "заяц" явно так на вскидку на 5-7% быстрее )).

Добавлено через 8 минут
jugu профайлер не изучал )), помнится точки остановки только проверял ото и все.
Да и в консоли быстрее, профайлер прогружается пару секунд так точно перед запуском, потом еще задержка перед выводом результатов.
Может для каких-то крутых дебагов и целесообразнее профайлер.

Добавлено через 1 минуту
Цитата Сообщение от jugu Посмотреть сообщение
Зачем для этой задачи писать тесты?
Чего там писать то... )) - НЕ софтварный рендер же и математику "оцифровывать" )).

Добавлено через 3 минуты
Цитата Сообщение от Renji Посмотреть сообщение
А так, второй вариант выглядит перспективнее.
Таки да - оказался перспективнее.
1
Заблокирован
09.08.2019, 23:09
C++
1
2
3
4
5
6
7
8
9
10
_asm
{
  lea esi,[n+8]
  xor ecx,ecx
  mov ecx,100200300
next:
  mov [esi],ecx
  add esi,12
  loop next
}
вроде так
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.08.2019, 23:09
Помогаю со студенческими работами здесь

Скорость чтения/записи
Всем привет! Есть ли какие-нибудь библиотеки в Java, чтобы узнать скорость чтения/записи на диск? Интересует именно Java, потому что...

Скорость чтения SSD
Имею SSD Goodram CL.100 gen.3 на 240 GB на контроллере SMI2258XT. Заполнен на 46% (102 / 223 Гб). Подключён в SATA 2, ибо материнка старая....

скорость чтения - копейки
Проблема в том, что скорость чтения на жестком упала более чем в сотни раз...жесткому около полугода wd scorpio blue wd3200bevt 320 gb....

Скорость чтения DVD
Здравствуйте форумчане, Подскажите пожалуйста, вот у современных DVD приводов скорость x16 (что примерно 21 Мб/с). А есть ли более...

Скорость чтения базы SQLite
Добрый день. Подскажите, пожалуйста, какой-нибудь удобный метод ускорения работы SQLite. У меня есть вот такая база. При...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД 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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru