Который быстрее - C# небезопасный код или необработанный C++

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

24
задан Mysticial 15 December 2014 в 07:44
поделиться

9 ответов

это должно быть максимально быстро

Тогда, Вы задаете неправильный вопрос.

Код это в ассемблере, с различными версиями для каждого значительного варианта архитектуры Вы поддерживаете.

Использование в качестве руководства вывод из хорошего компилятора C++ с оптимизацией, потому что это, вероятно, знает некоторые приемы, которые Вы не делаете. Но Вы, вероятно, будете в состоянии думать о некоторых улучшениях, потому что C++ не обязательно передает компилятору всю информацию, которая могла бы быть полезна для оптимизации. Например, C++ не имеет ключевого слова C99, ограничивают. Хотя в том особом случае много компиляторов C++ (включая MSVC) действительно теперь поддерживают его, так используйте его, если это возможно.

, Конечно, если Вы имеете в виду, "Я хочу, чтобы он был быстр, но не вплоть до выхода наружу C# или C++", тогда отличающийся ответ;-)

я ожидал бы, что C#, по крайней мере, приблизится к производительности подобно выглядящего C++ в большом количестве случаев. Я предполагаю, конечно, что программа будет работать достаточно долго, что время сам JIT взятия не важны, но если Вы обрабатываете много видео тогда, это кажется вероятным. Но я также ожидал бы там быть определенными вещами, которые, если Вы делаете их в небезопасном C#, будут намного медленнее, чем эквивалентная вещь в C++. Я не знаю, каковы они, потому что весь мой опыт МОНЕТ В ПЯТЬ ЦЕНТОВ находится в Java, а не CLR. Могли бы также быть вещи, которые медленнее в C++, например, если Ваш алгоритм превращает какие-либо вызовы назад в код C#.

, К сожалению, единственный способ быть уверенным, как близко это, состоит в том, чтобы записать обоим и протестировать их, какой вид упускает суть, что запись версии C++ является набором дополнительного усилия. Однако Вы могли бы быть в состоянии получить общее представление путем взламывания некоторого быстрого кода, который приближает обработку, Вы хотите сделать, обязательно не делая всего этого или разбирания в нем. Если Вы, которых алгоритм собирается циклично выполнить по всем пикселям и сделать некоторых операция в секунду FP на пиксель, то взламывание вместе грубого сравнительного теста должно занять все полчаса.

Обычно я отговаривал бы от того, чтобы начинать взгляды, "это должно быть максимально быстро". Требования должны быть достижимыми, и по определению "максимально X," только достижимая граница. Требования должны также быть тестируемыми, и "максимально X," не является тестируемым, если Вы так или иначе не знаете теоретического максимума. Более дружественное требование, "это должно обработать видеокадры такого-то и такого-то разрешения в режиме реального времени на таком-то и таком-то ЦП скорости", или "это должно быть быстрее, чем продукт нашего основного конкурента". Если версия C# делает это, с немного для экономии для составления неожиданных незначительных проблем в установке пользователя, то сделанное задание.

70
ответ дан Steve Jessop 28 November 2019 в 22:13
поделиться

Это зависит от алгоритма, реализации, компилятора C++ и JIT-компилятора. Я предполагаю в большинстве случаев, что реализация C++ будет быстрее. Но это может измениться.

JIT-компилятор может оптимизировать Ваш код для платформы, на которой Ваш код работает вместо среднего числа для всех платформ, на которых мог бы работать Ваш код, как компилятор C++ делает. Это - что-то, в чем более новые версии JIT-компилятора все больше хороши и могут в некоторых случаях дать коду JITted преимущество. Таким образом, ответ не является столь четким, как Вы могли бы ожидать. Новый компилятор горячей точки Java делает это очень хорошо, например.

Другие ситуации, где управляемый код может добиться большего успеха, чем C++, состоят в том, где необходимо выделить и освободить много маленьких объектов. .net время выполнения предварительно выделяет большие блоки памяти, которая может быть снова использована так, это не должно звонить в OS каждый раз, когда необходимо выделить память.

я не уверен, что небезопасный C# работает намного быстрее, чем нормальный C#. Необходимо будет попробовать это также.

, Если Вы хотите знать то, что является лучшим решением для Вашей ситуации, необходимо будет попробовать обоих и измерить различие. Я не думаю, что будут [больше чем 114]

6
ответ дан Mendelt 28 November 2019 в 22:13
поделиться

C# обычно медленнее, чем C++. В управляемом коде существуют проверки на этапе выполнения. Это то, что делает, это справилось, в конце концов. C++ не должен проверять, были ли границы массива превышены, например.

На основе моего опыта, с помощью постоянной памяти помогает много. Существует новое Система. Класс IO.UnmanagedMemoryAccessor в.NET 4.0, который может помочь в будущем.

6
ответ дан Thomas Bratt 28 November 2019 в 22:13
поделиться

Языки не имеют "скорости". Это зависит от компилятора и кода. Возможно записать неэффективный код на любом языке, и умный компилятор генерирует почти оптимальный код, неважно, язык источника.

единственный действительно неизбежный фактор в производительности между C# и C++ - то, что приложения C# должны сделать больше при запуске (загрузите платформу.NET и возможно JIT некоторый код), так при прочих равных условиях они запустятся немного медленнее. После этого это зависит, и нет никакой фундаментальной причины, почему один язык должен всегда быть быстрее, чем другой.

я также не знаю ни о каких причинах, почему небезопасный C# должен быть быстрее, чем безопасный. В целом, безопасный хорошо, потому что это позволяет компилятору делать некоторые намного более сильные предположения, и таким образом, безопасный мог бы быть быстрее. Но снова, это зависит от кода, который Вы компилируете, компилятор, который Вы используете и дюжина других факторов.

Короче говоря, разочаруйтесь в идее, что можно измерить уровень языка. Вы не можете. Язык никогда не является "быстрым" или медленным". Это не имеет скорости.

6
ответ дан jalf 28 November 2019 в 22:13
поделиться

Если Вы собираетесь реализовать свой алгоритм стандартным способом, я думаю, что это не важно. Но некоторые языки имеют привязку к пчеле или библиотекам, которые могут дать Вам не стандартное повышение.

  1. Рассматривают, можно ли использовать обработку GPU - Nvidia и ati обеспечивают CUDA и платформы CTM и существует продолжающееся standarization усилие от khronos группы (openGL). Догадка говорит мне также, что AMD добавит по крайней мере одно ядро процессора потоковой передачи в их будущих микросхемах. Таким образом, я думаю, что в той области существует настоящее обещание.

  2. Попытка видеть, можно ли использовать инструкции SSE, существуют библиотеки вокруг - большинство в C++ или C-, которые обеспечивают удобную пчелу, проверяют сайт Intel на удобные оптимизированные библиотеки, я действительно вспоминаю "Intel Performance Primitives" и "Математическое Ядро".

, Но на стороне политики, действительно включите свой алгоритм в OpenCV, таким образом, другие могут извлечь выгоду также.

4
ответ дан thAAAnos 28 November 2019 в 22:13
поделиться

Если Вы знаете свою среду, и Вы используете хороший компилятор (для обработки видеоданных на окнах, Intel C ++ Compiler является, вероятно, лучшим выбором), C++ победит C# без всяких усилий по нескольким причинам:

  • среда выполнения C++ не имеет никаких внутренних проверок на этапе выполнения (оборотная сторона, являющаяся этим, у Вас есть полная свобода аварийно завершить себя). Среда выполнения C# будет иметь некоторое продолжение проверки исправности, по крайней мере, первоначально.
  • компиляторы C++ создаются для оптимизации кода. В то время как теоретически возможно реализовать JIT-компилятор C# с помощью всей оптимизации voodo, что ICC (или GCC) использование, сомнительно, что JIT Microsoft надежно добьется большего успеха. Даже если JIT-компилятор имеет статистику во время выполнения, это все еще не так хорошо как ведомая профилем оптимизация или в ICC или в GCC.
  • среда C++ А позволяет Вам управлять своей моделью памяти намного лучше. Если Ваше приложение перейдет к сути дела перегрузки кэша данных или фрагментации "кучи", Вы будете действительно ценить дополнительное управление выделением. Heck, если можно избежать динамических выделений, Вы уже очень более обеспечены (подсказка: время выполнения malloc() или любое другое динамическое средство выделения недетерминировано, и почти все неродные языки вызывают более тяжелое использование "кучи", и таким образом более тяжелое выделение).

при использовании плохого компилятора, или если Вы не можете быть нацелены на хороший чипсет, , все ставки прочь .

2
ответ дан Tom Barta 28 November 2019 в 22:13
поделиться

Работа ЦП всегда будет быстрее, чем работа VM на ЦП. Я не могу полагать, что люди пытаются спорить иначе.

, Например, у нас есть некоторая довольно тяжелая работа обработки изображений над нашим веб-сервером, это стояло в очереди. Первоначально для получения его работа мы использовали функции GD PHP.

Они были медленными как ад. Мы переписали функциональность, в которой мы нуждались в C++.

-7
ответ дан Dave 28 November 2019 в 22:13
поделиться

Я немного опаздываю в ответе, но я могу дать Вам некоторый анекдотический опыт. У нас были некоторые стандартные программы умножения матриц, которые были первоначально кодированы в C# с помощью указателей и небезопасного кода. Это оказалось узким местом в нашем приложении, и мы тогда использовали pinning+P/Invoke для вызова в версию C++ стандартной программы Умножения матриц и получили фактор 2 улучшений. Это было только что с.NET 1.1, таким образом, вещи могли бы быть лучше теперь. Как другие указывают, это доказывает ничто, но это было интересное осуществление.

я также соглашаюсь с thAAAnos, если Вы, алгоритм действительно должен быть "максимально быстро" рычагами IPL или, если Вы должны, рассматриваете реализацию GPU.

1
ответ дан Peter Tate 28 November 2019 в 22:13
поделиться

Честно говоря, не так важно, на каком языке вы это пишете, чем какие алгоритмы вы используете (IMO, по крайней мере). Возможно, перейдя на собственный код, вы сможете ускорить свое приложение, но это также может сделать его медленнее - это будет зависеть от компилятора, от того, как написаны программы, какие затраты на взаимодействие вы потратите. возникновение, если вы используете смешанную среду и т. д. Ничего не скажешь без профилирования. (и, если на то пошло, профилировали ли вы свое приложение? Вы действительно знаете, на что оно тратит время? )

Лучший алгоритм полностью не зависит от выбранного вами языка.

1
ответ дан 28 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: