P>аналогичная прога на паскале работает намного быстрее, но исходников нет (((
P>дайте пару советов по оптимизации такого кода
1. Заранее вычислить 2*CellsNum. Вряд ли сколь-либо поможет, но все же.
2. вычислить заранее массив значений i3*kof/i4*kof в диапазоне [-Vg, Vg] и во внутренних циклах использовать вычисленные значения из массива.
3. Зампомнить один раз ссылку на элемент массива и пользовться ей:
Piero2 wrote:
> дайте пару советов по оптимизации такого кода
У тебя не четырёхмерный массив, а массив массивов массивов массивов. Это требуется алгоритмом или можно переделать?
А остальное — хз, компилятор должен такое оптимизировать. У тебя какой комплиятор? Включена ли оптимизация?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: 4-х массив
От:
Аноним
Дата:
09.03.07 11:26
Оценка:
Здравствуйте, ., Вы писали:
.>У тебя не четырёхмерный массив, а массив массивов массивов массивов.
В С/С++ четырёхмерный массив как раз и является массивом массивов массивов массивов.
.> Это требуется алгоритмом или можно переделать?
Аноним wrote:
> В С/С++ четырёхмерный массив как раз и является массивом массивов > массивов массивов.
Нет, в С++ встроенных многомерных массивов нет. [] в объявлении означает "превращение" типа в массива, так что запись
вида int[][] означает массив массивов, а не двухмерный массив.
> .> Это требуется алгоритмом или можно переделать? > > А у тебя какие предложения?
Ну как обычно —
int array[M*N*K*L]
И индексируешься как:
array[((m*N+n)*K+k)*L+l];
(вроде ничего не напутал в арифметике)
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: 4-х массив
От:
Аноним
Дата:
09.03.07 13:00
Оценка:
Здравствуйте, ., Вы писали:
>> В С/С++ четырёхмерный массив как раз и является массивом массивов >> массивов массивов. .>Нет, в С++ встроенных многомерных массивов нет. [] в объявлении означает "превращение" типа в массива, так что запись .>вида int[][] означает массив массивов, а не двухмерный массив.
Молодец. Но фактически это двумерный массив.
>> А у тебя какие предложения? .>Ну как обычно - .>int array[M*N*K*L]
Обычно? Ты так делаешь обычно и называешь 4-мерным массивом? Вообще-то он одномерный...
.>И индексируешься как: .>array[((m*N+n)*K+k)*L+l];
Думаешь ты в чем-то выгадал по сравнению с "массивом массивов"? Ты считаешь что твое индексирование эффективнее чем сделает компилятор?
Аноним wrote:
> Думаешь ты в чем-то выгадал по сравнению с "массивом массивов"? Ты > считаешь что твое индексирование эффективнее чем сделает компилятор?
Это алгоритмически другая конструкция. Иногда выгоднее, иногда нет. Я не знаю что именно требуется в данной задаче.
Массив массивов может быть таким:
[1,2,3]
[4,5]
[6,7,8,9]
т.е. по сути это массив указателей, каждый указатель указывает на массив значений.
Память выделяемая под массив массивов N*M*<размер значения>+N*<размер указателя>.
если же двухмерный массив (ака матрица), то он может быть только таким:
[1,2,3]
[4,5,6]
[7,8,9]
Реализовываться может с помомщью одномерного массива с вычислением индекса по паре значений.
Память выделяемая под двумерный массив N*M*<размер значения>.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
в ходе испытаний было установленно(ну и так легко догодаться):
при комментировании строк внутри 4-го цикла — программа работает быстрее, именно их необходимо оптимизировать.
может быть действительно сделать одномерный массив и станет быстрее... ща подумаю
Здравствуйте, Piero2, Вы писали:
P>Bell, спасибо ща почитаем, а на какой прирост скорости примерно можно расчитывать?
Мне кажется, что на большой прирост расчитывать не стОит. Но посмотреть на диагностику профайлера никогда не помешает.
Кстати что в твоем случае значит "медленно"? Какой объем входных данных? Количество итераций? Насколько быстрее паскалевская программа? Ты уверен, что эта самая паскалевская программа идентична твоей сишной?
Да, и что представляет из себя Q1?
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Piero2, Вы писали:
P>>Bell, спасибо ща почитаем, а на какой прирост скорости примерно можно расчитывать?
B>Мне кажется, что на большой прирост расчитывать не стОит. Но посмотреть на диагностику профайлера никогда не помешает. B>Кстати что в твоем случае значит "медленно"? Какой объем входных данных? Количество итераций? Насколько быстрее паскалевская программа? Ты уверен, что эта самая паскалевская программа идентична твоей сишной? B>Да, и что представляет из себя Q1?
в последней версии программы
int ****Q1
итераций:
c =40;
Vg = 5;
т.е. получается: 41^2*11^2 = 203 000 итераций
удалось добыть кусок паскаль программы:
for kVSm:=-Size_A to Size_A do
begin {111}
mVx:=trunc(Sm_time*kVSm+0.5);
for kVSb:=-Size_B to Size_B do
begin {112}
mVy:=trunc(Sb_time*kVSb+0.5);
for m:=-SizeDK0_5 to SizeDK0_5 do
begin {113}
m1:=m+mVx;
for n:=-SizeDK0_5 to SizeDK0_5 do
begin {114}
Q[m,n,kVSm,kVSb]:=Q[m,n,kVSm,kVSb]+Ext_DK[m1,n+mVy];
if Q[m,n,kVSm,kVSb]< Qmin then
begin {115}
Qmin:=Q[m,n,kVSm,kVSb];
Mmin:=m;
Nmin:=n;
Kmin1:=kVSm;
Kmin2:=kVSb;
end {115}
end; {114}
end; {113}
end; {112}
end; {111}
суть здесь та же, я не вижу чем моя прога хуже, но эта работает намноооого быстрее, моя прога подвисает на 30 секунд, а эта 2-3 секунды при тех же входных данных
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Piero2, Вы писали:
P>>включил оптимизацию — еще немного побыстрее B>Как кстати включил? Конфигурация точно release? Не debug?
Здравствуйте, Piero2, Вы писали:
P>Здравствуйте, Bell, Вы писали:
B>>Здравствуйте, Piero2, Вы писали:
P>>>включил оптимизацию — еще немного побыстрее B>>Как кстати включил? Конфигурация точно release? Не debug?
P>в опциях проекта, да release стоит
а в 2003 студии как ето зделать ?
там в линкере есть оптимизация и пункты:
1 References
2 Enable COMDAT folding
3 Optimize for Windows 98
4 Function order
ето то о чом вы пишете ?
и что там ставить ? что за что отвечает ?