Racoon
Добрый вечер. Есть код for (int i = 0; i <l1; i++) { for (int j = i + 10; j <l1; j++) { roro = 0; for (int ii = 0; ii < l2; ii++) { for (int jj = 0; jj < l3; jj++) { var temp = (z[i][ii][jj] - z[j][ii][jj]); roro += temp * temp; } } } } double ***z = new double**[l2]; Реализовано на C# и С++, но почему-то на первом работае быстрее. Может дело в флагах компиляции?
Aidar
вангую непопадания в кэш а поди в шарпе это какойнить tightly packed array
Berkus
нам не сказали насколько быстрее, может это просто debug-build-vs-release-build
Racoon
оба в состояния релиза
Racoon
9 мс и 22 мс
Racoon
флаги ищу.
Aidar
9 мс и 22 мс
там только этот код?
Racoon
да
Berkus
ну может и кэш, а флаги еще интересно посмотреть и векторизацию
Aidar
не правда
Aidar
нормальный компилятор бы выкинул этот код полностью тогда
Aidar
если он не учавствует в сайдэффектах
Matwey
да
А чему равны l1 l2 l3?
Racoon
на моем примере 26000 1 1
Ioann_
В кеш оно б должно попадать
Ioann_
Не вижу причин не попадать.
Racoon
я работаю через студию /Yu"stdafx.h" /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\FNN.pch" /diagnostics:classic вроде это влаги
Ioann_
На счет new, разве что могут быть проблемы
Aidar
это не си++
Racoon
double temp = (z[i][ii][jj] - z[j][ii][jj]);
Matwey
это не си++
А вдруг там #define var auto ?
Matwey
И получается валидный C++
Berkus
ну я подозревал что там больше бесмыссленно
Ioann_
double temp = (z[i][ii][jj] - z[j][ii][jj]);
Знаешь чо сделай, разверни цикл последний на 4 итерации вперед.
Aidar
на моем примере 26000 1 1
>double ***z = new double**[l2]; и при этом for (int i = 0; i <l1; i++) и emp = (z[i][ii][jj] - z[j][ii][jj])
Racoon
https://pastebin.com/XRrLBVjD https://pastebin.com/Kja4bnUP
Berkus
Berkus
компилер сам это может
Racoon
ставила точки останова
Constantine
22мс это порядка разрешения таймера
Constantine
запуск в visual studio под отладчиком приводит к замедлению аллокаций памяти
Berkus
ставила точки останова
гммм ну это не очень точно
Aidar
https://pastebin.com/XRrLBVjD https://pastebin.com/Kja4bnUP
объясни int l1 = num.size() - m; int l2 = m; int l3 = num[0].size(); double ***z = new double**[l2]; for (int i = 0; i < num.size() - m; i++) { z[i] = new double*[l2];
Racoon
пардон секунд.
Racoon
это данные из файла
Aidar
почему у тебя массив до l2 а заполняешь ты его до l1
Constantine
/fp:precise
Ioann_
пардон секунд.
Погоди. А ты вот эти все new что скинул на пастебин, тоже замеряешь ?
Constantine
вам точно нужно fp:precise?
Berkus
по идее vectorizer включен по дефолту, но может он чего не смог
Ioann_
Погоди. А ты вот эти все new что скинул на пастебин, тоже замеряешь ?
Если да, то дело может быть в них. Я читал, что в шарпе менджер памяти побыстрее плюсового.
Ioann_
Или что то этом духе.
Racoon
да там ошибка л1 должно быть, тогда будет еще дольше работать
Constantine
и да, такой вопрос
Berkus
там аллокатор действительно проще и быстрее
Ioann_
Ну я знаю. Вот я и читал, что там операции new даются быстрее. Да.
Constantine
нагруженный аллокатор надо измерять без вижака всегда
Constantine
вижак когда аттачится, видимо, переключает отладочные флаги кучи
Constantine
и да, такой вопрос
и да, такой вопрос: вы же считаете АКФ, вы понимаете, что она считается через Фурье при больших l1?
Racoon
Оказалось это студия некоректно реагировала на ту ошибку с л1.
Racoon
Исправила выполнение оклоко секунды
Constantine
?
Racoon
не вылетала ошибка о том, что не выделено место, а просто работал код с муссором
Constantine
for (int k = 0; k < m; k++)
Constantine
это тоже выглядит как ошибка)
Constantine
угу, релиз санитайзить не будет
Constantine
и в любом случае написан расчет АКФ
Constantine
хех, оукей
шланг бы оптимизировал в return 42, да
Berkus
так там memory allocation в динамике фейлился или чо?
Constantine
там был индекс перепутан
Constantine
лень разбираться, overrun или underrun
Berkus
там был индекс перепутан
а, логичный результат хренового именования
Constantine
а, логичный результат хренового именования
именование нормальное, его просто забыли использовать
Berkus
если назвать переменные i, l, j, ii, ll, jj, iii, lll, jjj то рано или поздно в них запутаешься
Constantine
ну i, j, k и sz1, sz2, sz3 не должен запутаться
Constantine
а вообще второй отстрел мозга паскаль-олимпиадников это что j0 в глобале нельзя
Constantine
я просто там дефайны видел