Пара вещей, на которые стоит обратить внимание:
Во-первых, циклы в C ++ не медленны по сравнению со встроенными функциями. В MatLab чем меньше операций, тем лучше, поэтому лучше вызывать встроенные функции, которые представляют собой одну операцию, выполняемую с оптимизированным кодом. В C ++ ВАШ код оптимизируется одинаково со встроенными функциями.
Далее GetPixel
чрезвычайно медленно. Попробуйте Bitmap.LockBits
вместо. По иронии судьбы, это, кажется, противоречит моему предыдущему утверждению, но на самом деле это не потому, что цикл внутри LockBits
быстрее, чем вы делаете цикл, а потому, что GetPixel
использует другой метод, который намного медленнее.
Как только вы переключитесь на LockBits
, вы, вероятно, сможете снова удвоить или утроить вашу скорость, развернув цикл, если компилятор еще этого не делает.
Наконец, убедитесь, что вы правильно используете локальность кэша. Попробуйте оба зацикленных порядка (например, for (a...) for (b...)
и for (b...) for (a...)
) и измерьте время каждого из них, чтобы выяснить, какой из них быстрее.