это должно быть как можно быстрее
Тогда вы задаете не тот вопрос.
Кодируйте его на ассемблере, с разными версиями для каждого поддерживаемого вами варианта архитектуры.
Используйте в качестве руководства вывод хорошего компилятора C ++ с оптимизацией, потому что он, вероятно, знает некоторые хитрости, которых вы не знаете. Но вы, вероятно, сможете подумать о некоторых улучшениях, потому что C ++ не обязательно передает компилятору всю информацию, которая может быть полезна для оптимизации. Например, C ++ не имеет ограничения по ключевому слову C99. Хотя в этом конкретном случае многие компиляторы C ++ (включая MSVC) теперь поддерживают его, поэтому используйте его там, где это возможно.
Конечно, если вы имеете в виду: «Я хочу, чтобы это было быстро, но не настолько, чтобы выходить за пределы C # или C ++», тогда ответ будет другим; -)
Я бы ожидал, что во многих случаях C # приблизится к производительности похожего на C ++. Конечно, я предполагаю, что программа будет работать достаточно долго, поэтому время, затрачиваемое самой JIT, не имеет значения, но если вы обрабатываете много видео, это кажется вероятным. Но я также ожидаю, что будут некоторые вещи, которые, если вы сделаете их в небезопасном C #, будут намного медленнее, чем аналогичные вещи в C ++. Я не знаю, что это такое, потому что весь мой опыт работы с JIT связан с Java, а не с CLR. Также могут быть вещи, которые медленнее в C ++, например, если ваш алгоритм делает какие-либо вызовы обратно в код C #.
К сожалению, единственный способ убедиться в том, насколько это близко, - написать оба и протестировать их, что упускает из виду тот факт, что написание версии C ++ - это куча дополнительных усилий. Тем не менее, вы можете получить грубое представление, взломав некоторый быстрый код, который приблизительно соответствует той обработке, которую вы хотите выполнить, без необходимости делать все это или делать все правильно. Если ваш алгоритм зацикливается на всех пикселях и выполняет несколько операций FP на пиксель, то для взлома приблизительного теста потребуется полчаса.
Обычно я бы советовал не думать, что это должно быть как можно быстрее. Требования должны быть достижимы, и по определению «как X, насколько это возможно» достижимы только границы. Требования также должны быть проверяемыми, и «насколько возможно, X» не проверяемо, если вы не знаете теоретический максимум. Более дружеское требование: «для этого требуется обрабатывать видеокадры с таким-то разрешением в реальном времени на такой-то быстродействующей ЦП», или «это должно быть быстрее, чем у нашего основного конкурента». Если версия C # делает это с небольшим запасом, чтобы учесть непредвиденные незначительные проблемы в настройке пользователя, то работа выполнена.