Страница: 1 | 2 | 3 |
Вопрос: C# : Очень медленно работает код!
Добавлено: 04.09.10 11:05
Автор вопроса: Лёха | Web-сайт:
Ответы
Всего ответов: 41
Номер ответа: 16
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #16
Добавлено: 06.09.10 19:33
Хотя, должен предупредить.. что ошибка не тривиальная.. и найти ее, точнее понять в чем косяк, будет достаточно не просто..
Номер ответа: 17
Автор ответа:
Лёха
Вопросов: 20
Ответов: 79
Web-сайт:
Профиль | | #17
Добавлено: 06.09.10 19:35
Я сейчас сижу ищу,но пока ничего не нашёл!
Номер ответа: 18
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #18
Добавлено: 06.09.10 20:10
Ладно, все равно ты не найдешь этот косяк..
Фишка в том, что если бы ты был внимательней то ты бы заметил, что я сначала создаю копию а потом проверяю формат, а ты же проверяешь PixelFormat а потом создаешь копию и с ней работаешь. Так вот, дефолтный конструктор new Bitmap создает картинку в формате Format32bppArgb т.е. изначально с альфа-каналом, а исходная твоя картинка имеет формат Format24bppRgb В результате - ты определяешь что у тебя 3 байта на пиксел, но работаешь с картинкой у которой реально 4 байта на пиксел и, как следствие, в оригинальном массиве у тебя один набор байт а работаешь ты совершенно с другим.. и из за этого у тебя неверный размер массива и шаг приращения в цикле.
Номер ответа: 19
Автор ответа:
Лёха
Вопросов: 20
Ответов: 79
Web-сайт:
Профиль | | #19
Добавлено: 06.09.10 21:14
А в С# работать с указателями так же как и в C++?
Номер ответа: 20
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #20
Добавлено: 06.09.10 21:20
да, только надо использовать unsafe mode
Номер ответа: 21
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #21
Добавлено: 06.09.10 21:23
и, разумеется, надо включить эту опцию в компиляторе.. по дефолту она отключена
Номер ответа: 22
Автор ответа:
Лёха
Вопросов: 20
Ответов: 79
Web-сайт:
Профиль | | #22
Добавлено: 06.09.10 21:25
Я так понимаю будет ещё быстрее? Этим способом быстро ,но хочется ещё быстрее,так как кртинка 4000х3000 обрабатывается с задержкой,
а хочется чтоб обрабатывалась с такой же скоростью как 320х240.Это реально на C#?
Номер ответа: 23
Автор ответа:
Лёха
Вопросов: 20
Ответов: 79
Web-сайт:
Профиль | | #23
Добавлено: 06.09.10 21:38
Если использовать unsafe mode надо собирать мусор,а как его собирать(чёто слышал про класс GC) ?
Номер ответа: 24
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #24
Добавлено: 06.09.10 21:44
Это даже на С++ не реально.. выше головы все равно не прыгнешь.. 4000*3000*4 это уже сам по себе достаточно серьезный размер массива.. и даже тупо перебрать его в цикле ничего не делая потребует времени.. При таких размерах,скорее всего, используются другие методы обработки изображений и это наверняка не просто инкрементация определенных байт.. С указателями ты однозначно получишь прирост производительности, но это не будет так же как 320*240.
Кстати, как вариант, при использовании FW 4/0, эта задача просто шикарно бы вписалась в концепцию распаралеливания.. и вот там,раскидав задачу по ядрам, скорее всего тоже можно получить прирост производительности.
Неплохо было бы прогнать бенчмарка на этой задаче..
Номер ответа: 25
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #25
Добавлено: 06.09.10 21:45
В твоем случае не будет мусора.. ты не плодишь объекты и не убиваешь их.. ты тупо будешь править память на лету..
Номер ответа: 26
Автор ответа:
Лёха
Вопросов: 20
Ответов: 79
Web-сайт:
Профиль | | #26
Добавлено: 06.09.10 21:58
Что-нибудь слышал про IPP?
Номер ответа: 27
Автор ответа:
Лёха
Вопросов: 20
Ответов: 79
Web-сайт:
Профиль | | #27
Добавлено: 06.09.10 22:31
Можешь пожалуйста написать простенький примерчик,для unsafe mode - как работать с памятью на лету,я попробовал чёто написать но из этого получился полный бред(с указателями плохо знаком):
Номер ответа: 28
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #28
Добавлено: 06.09.10 23:59
Я не сторонник использования unsafe mode, поэтому попробуй такой вариант правки памяти. Тут я избавился от 2х кратного копирования куска памяти в массив и обратно при каждом чихе, но остаются еще потери на проверки выхода за границы массива. В любом случае это должно несколько ускорить производительность..
Вот мой вариант..
Номер ответа: 29
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #29
Добавлено: 07.09.10 01:25
Ну и последний вариант, с unsafe и указателями.. Не знаю,вряд ли он даст существенный прирост быстродействия.. если и даст то незначительный.. имхо, предыдущий вариант самый оптимальный для С#
Номер ответа: 30
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #30
Добавлено: 07.09.10 01:31
Как обычно форум схавал i в квадратных скобках (((