Здравствуйте, alexzz, Вы писали:
_>>Ну во-первых твой код — это не C#, а unsafe C#, что существенно. Причём даже не просто unsafe (в смысле модификатора), а ещё и дико страшный из-за необходимости обхода всех штатных тормозов.
A>Не понял конец фразы. Тормоза, связанные с закреплением объектов в памяти, они как Лохнесское чудовище — все про них слышали, но никто не видел. Надо просто соблюдать рекомендации.
Нет, здесь речь шла о том, что ты используешь *array вместо array[], чтобы обойти штатные тормоза из-за проверки границ массива. И это явно не способствует красоте кода. )))
_>>Т.е. писать так код постоянно — это убиться. )))
A>Навскидку для 90% кода скорость вообще не важна — делаешь его красивым и удобным в обслуживании. Для ещё 9% просто используешь быстрый алгоритм, подходящие типы коллекций, многопоточность. В оставшихся случаях можно пошаманить:
A>- самодельные специфические коллекции,
A>- unsafe,
A>- Mono.Simd / System.Numerics,
A>- вызов нативного кода (самый неудобный вариант).
A>Короче, такого кода, где unsafe имеет смысл, надо пол-процента (если вообще надо). И пофиг, как он выглядит. Ты же не пишешь весь свой код интринзиками.
Всё верно. И на C# и на C++ можно создать решение как в красивом и удобном стиле, так и в страшном и неудобном, но зато где-то в 2 раза более быстром (хотя для C++ это уже верно только для случаев с SIMD, т.к. в других случаях штатный оптимизатор круче любого спеца по ассемблеру). Только есть один нюанс: красивое решение на C# более чем в 6 раз медленнее красивого решения на C++.
Ну точнее если говорить по честному, то в 6+ раз оно будет быстрее только на подобном коде (с обработкой массивов и т.п.), а в обычном коде скорее всего будет 2+ раза. Но это тоже совсем не мало. ))) Да и обработка массивов тоже частенько встречается. )
A>Имхо, с тысячами итераций тебе бы надо на GPU перейти, а не мучить С++.
Ну вообще то по реальным делам у меня скорее вещи типа blur'a возникают (причём в реальном времени), а не конечные автоматы. Только последние гораздо удобнее для подобного теста, при почти одинаковом коде.
Но вообще может и попробую здесь GPU в ближайшее время — с появлением openacc это стало настолько же тривиально, как и распараллеливания по ядрам CPU с помощью openmp.