2. Более быстрое время доступа, которое было достигнуто здесь, никогда не связано с объектом или структурой, оно просто обусловлено оптимизацией компилятора для оператора "switch".
3. Оптимизация switch зависит от количества случаев + режима оптимизации. Большое количество или сложные переключатели не получат такой оптимизации таблицы переходов и останутся в виде нескольких if-else.
4. Таблица поиска с использованием массива всегда будет стандартным и самым надежным методом, не зависящим ни от количества случаев, ни от их сложности, ни от режима оптимизации компилятора.
int Lookup_Table(int x)
{
staticint table[16] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150};
return table[x];
}
// При компиляции маленького или среднего переключателя с последовательными случаями (от 0 до n), при// в режиме оптимизации компилятор преобразует серию этих нескольких if-else// операторов O(n) в таблицу переходов, где массив указателей на блоки кода// индексируется по номеру дела во время выполнения, обеспечивая O(1) прямой доступ, подобный// в таблицу поиска с помощью массива.int Switch(int x)
{
switch(x)
{
case0: return0;
case1: return10;
case2: return20;
case3: return30;
case4: return40;
case5: return50;
case6: return60;
case7: return70;
case8: return80;
case9: return90;
case10: return100;
case11: return110;
case12: return120;
case13: return130;
case14: return140;
case15: return150;
}
return -1;
}
voidOnStart()
{
long sum1 = 0;
long sum2 = 0;
int slots = 16;
int test_count = 1 e8;
int seed = MathRand();
ulong time1 = GetMicrosecondCount();
for(int i = 0; i < test_count; i++)
for(int x = 0; x < slots; x++) {
//int j = (x * 7 + seed) % slots; // отмените две строки для проверки поиска в случайном порядке (алгоритм Miller Shuffle)//sum1 += Lookup_Table(j); //в реальной ситуации поиск не является последовательным
sum1 += Lookup_Table(x);
}
time1 = GetMicrosecondCount() - time1;
PrintFormat("%6ull microsec, sum:%ull %s", time1, sum1, " // Lookup table");
ulong time2 = GetMicrosecondCount();
for(int i = 0; i < test_count; i++)
for(int x = 0; x < slots; x++) {
//int j = (x * 7 + seed) % slots;//sum2 += Switch(j);
sum2 += Switch(x);
}
time2 = GetMicrosecondCount() - time2;
PrintFormat("%6ull microsec, sum:%ull %s", time2, sum2, " // Switch statement");
}
Доказательств нет, но printf() в экспертном журнале снова усекает выводимые строки, причем произвольно.
Очевидно, что ограничение на печать строк, превышающих размер 16K, снова обрезается, как это было довольно много лет назад, и теперь вернулось. - Единственное возможное исправление - примерно такое:
Приведенный выше код на самом деле нуждается в более сложной обертке с шаблонизированными вызовами, такой, чтобы вы могли пройти через StringFormat() перед отправкой строки в вышеуказанную функцию.
Примеры этого бага уже приводились, пожалуйста, поищите на форуме, если сомневаетесь в моих выводах и отчетах.
2025.08.2411:18:40.544 Test shablon (AUDCAD,M5) 3 Years 6 Months
2025.08.2411:18:40.544 Test shablon (AUDCAD,M5) 1 Days
2025.08.2411:18:40.544 Test shablon (AUDCAD,M5) 1 Years 2 Days
2025.08.2411:18:40.544 Test shablon (AUDCAD,M5) 1 Years 1 Days
b5179, еще одно интересное поведение компилятора.
Если во время сложения выполнить дополнительную битовую операцию, то скорость выполнения увеличивается на 40 %.
Строка поиска: Ошибка 139.
Вторая функция обнуляет размер массива.
Неправильно!
Я пишу в русскоязычной ветке, которая автоматически переводится в англоязычную, что Вы читаете.
К сожалению, удаление ошибочного поста в русскоязычной ветке никак не сказалось на англоязычной ветке.
Максимальная оптимизация:
Более быстрое время доступа обусловлено сгенерированной таблицей переходов в режиме полной оптимизации.
Без оптимизации:
Простой и надежный код для генерации полного 32-битного беззнакового случайного числа в диапазоне [0, UINT_MAX]:
мы также можем использовать его в качестве функции
Старая ошибка снова возвращается.
Доказательств нет, но printf() в экспертном журнале снова усекает выводимые строки, причем произвольно.
Очевидно, что ограничение на печать строк, превышающих размер 16K, снова обрезается, как это было довольно много лет назад, и теперь вернулось. - Единственное возможное исправление - примерно такое:
Приведенный выше код на самом деле нуждается в более сложной обертке с шаблонизированными вызовами, такой, чтобы вы могли пройти через StringFormat() перед отправкой строки в вышеуказанную функцию.
Примеры этого бага уже приводились, пожалуйста, поищите на форуме, если сомневаетесь в моих выводах и отчетах.
Нужно было определить длительность интервала тестирования.
Не нашел на форуме, поэтому написал такую функцию.
Вроде, правильно показывает.
Не нашел на форуме, поэтому написал такую функцию.
Нужно было определить длительность интервала тестирования.
Не нашел на форуме, поэтому написал такую функцию.
Вроде, правильно показывает.
К чему такие навороты?
Результат тот-же
К чему такие навороты?
Результат тот-же