Хоть я не совсем понял, что за смещение вы хотели получить, но понять косяк просто: абсолютный адрес полностью бесполезен в вычислениях. Вы забыли что точкой отсчёта для памяти является адрес структуры? И вы наверное хотели получить смещение массива в блоке памяти структуры? А это получается разницей адресов структуры и нулевого элемента массива.
Если нет значения в буфере на баре, то это нужно явно прописать в буфере. Т.е., если рассчитанное значение должно быть выведено в буфер - записываем его в буфер, иначе - записываем пустое значение.
Хоть я не совсем понял, что за смещение вы хотели получить, но понять косяк просто: абсолютный адрес полностью бесполезен в вычислениях. Вы забыли что точкой отсчёта для памяти является адрес структуры? И вы наверное хотели получить смещение массива в блоке памяти структуры? А это получается разницей адресов структуры и нулевого элемента массива.
int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
3 1 2 4
Действия по порядку:
1 - получаем адрес первого эл-та ar[] в текущей структуре data.
2. узнаём его смещения от начал кэш-линии
3. находим кол-во байт от него до конца кэш-линии
4. узнаём кол-во интов, которые вместятся в это пространство до конца кэш-линии.
Вы у себя запускали? Разница в скорости есть? Или это лишь у меня?
у динамического массива больше проверок, Ренат как-то писал, пост не найду, как раз в разговоре об обращении по индексу, почему существенно медленней плюсов
TheXpert: у динамического массива больше проверок, Ренат как-то писал, пост не найду, как раз в разговоре об обращении по индексу, почему существенно медленней плюсов
Получается, что при заполнении динамических массивов лучше сначала заполнять статические, а потом делать ArrayCopy в динамические.
Вы из статического сделали динамический массив. Отсюда все вытекающие проблемы типа:
int a[][100];
ArrayResize(a, 100);
ZeroMemory(a);
// Первый цикл
for(int i; i < 100; ++i)
{
for(int n; n < 100; ++n)
{
a[i][n]++;
}
}
// Второй цикл
for(int n; n < 100; ++n)
{
for(int i; i < 100; ++i)
{
a[i][n]++;
}
}
Когда первый и второй циклы работают с разной скоростью.
Опять мимо, все развивается, все больше упор делается на многопоточность, и вот вам пожалуйтса - крестовая стд библиотека вам всё расскажет
https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size
Возможно, но пока вы меня не убедили.Не подскажет, а нагадает. Внимательно читаем спецификацию.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Возможно, но пока вы меня не убедили.
Хоть я не совсем понял, что за смещение вы хотели получить, но понять косяк просто: абсолютный адрес полностью бесполезен в вычислениях. Вы забыли что точкой отсчёта для памяти является адрес структуры? И вы наверное хотели получить смещение массива в блоке памяти структуры? А это получается разницей адресов структуры и нулевого элемента массива.
Если нет значения в буфере на баре, то это нужно явно прописать в буфере. Т.е., если рассчитанное значение должно быть выведено в буфер - записываем его в буфер, иначе - записываем пустое значение.
Спасибо, Артем.
Хоть я не совсем понял, что за смещение вы хотели получить, но понять косяк просто: абсолютный адрес полностью бесполезен в вычислениях. Вы забыли что точкой отсчёта для памяти является адрес структуры? И вы наверное хотели получить смещение массива в блоке памяти структуры? А это получается разницей адресов структуры и нулевого элемента массива.
Действия по порядку:
1 - получаем адрес первого эл-та ar[] в текущей структуре data.
2. узнаём его смещения от начал кэш-линии
3. находим кол-во байт от него до конца кэш-линии
4. узнаём кол-во интов, которые вместятся в это пространство до конца кэш-линии.
Вы у себя запускали? Разница в скорости есть? Или это лишь у меня?
2. узнаём его смещения от начал кэш-линии
С чего вы взяли что так можно определить какое-то смещение?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2019.07.09 11:13
Data data[]; ArrayResize(data, 32768);происходит замедление в 6 раз!
От чего эти тормоза?
Довёл до ума первоначальную идею (в первом коде неправильно считал адреса). Если не затруднит, то интересно будет посмотреть на результат у вас.
Разброс сильный от запуска к запуску, разницы постоянной в чью-то сторону не видно. Конечно, запускаю Release-вариант.
у динамического массива больше проверок, Ренат как-то писал, пост не найду, как раз в разговоре об обращении по индексу, почему существенно медленней плюсов
Получается, что при заполнении динамических массивов лучше сначала заполнять статические, а потом делать ArrayCopy в динамические.
От чего эти тормоза?
Вы из статического сделали динамический массив. Отсюда все вытекающие проблемы типа:
Когда первый и второй циклы работают с разной скоростью.
Спасибо. Странно, конечно. У меня стабильная разница.