Я пытаюсь сократить вычислительное время моего кода MatLab. Для этого я использую MatLab profiler .
В некоторых функциях я был в такой же ситуации. Я зацикливаюсь на сетке (2D матрица) и проверяю, имеет ли каждая ячейка (или нет) некоторые значения (по два каждый раз). И состояние занимает много времени. Большую часть времени тратит на эти функции.
Вот пример из моего кода:
time Calls line
16 function tGrid=some_compute(grid, tGrid, trans)
0.005 125 17 global depth width tWidth
18
< 0.001 125 19 for i=1:depth
0.022 125000 20 for j=1:width
2.270 37500000 21 if (grid(i, j)~=0 && grid(i, j)~=1)
22
23 % Get the transformed coordinates of the current cell
0.864 79997 24 [x, y]=get_trans(trans, i, j);
25
0.006 79997 26 if (x~=-1 && y~=-1)
0.006 79992 27 tGrid(x, y)=grid(i, j);
0.004 79992 28 end % If x~=-1 && y~=-1
0.004 79997 29 end % If grid~=0 && grid~=1
1.933 37500000 30 end % For j=width
0.008 125000 31 end % For i=depth
32
< 0.001 125 33 end
Эта функция в общей сложности занимает 5,24 с для 125 вызовов.
Как мы видим, это строка 21, которая занимает больше времени для выполнения. В то время как к условию grid(i, j)
обращаются дважды, и он также используется в строке 27, я предположил, что, предварительно сохранив его в переменной, он ускорит мой код.
Итак, я сделал этопростая модификация:
time Calls line
16 function tGrid=some_compute(grid, tGrid, trans)
0.005 125 17 global depth width tWidth
18
< 0.001 125 19 for i=1:depth
0.021 125000 20 for j=1:width
2.062 37500000 21 val=grid(i, j);
1.681 37500000 22 if (val~=0 && val~=1)
23
24 % Get the transformed coordinates of the current cell
0.793 79997 25 [x, y]=get_trans(trans, i, j);
26
0.005 79997 27 if (x~=-1 && y~=-1)
0.005 79992 28 tGrid(x, y)=val;
0.004 79992 29 end % If x~=-1 && y~=-1
0.004 79997 30 end % If grid~=0 && grid~=1
1.731 37500000 31 end % For j=width
0.007 125000 32 end % For i=depth
33
< 0.001 125 34 end
И теперь эта функция занимает в общей сложности 6,32 с для 125 вызовов.
Как мы видим, получение значения ячейки занимает столько же времени, сколько и получениеэто дважды и сравните его с двумя значениями. И строка 22 if такая же медленная, как и в первой версии. Я не понимаю почему.