2009-12-07 3 views
0

Раньше сегодня я сделал себе легкий поток памяти, который в основном пишет массив байтов. Я думал, что тест два из них, чтобы увидеть, если есть какая-то разница - И там было:C# - Библиотека по умолчанию имеет лучшую производительность?

(запись 1 байт в массив) MemoryStream: 1.0001ms шахты: 3.0004ms

Все говорит мне что MemoryStream в основном предоставляет байтовый массив и множество методов для работы с ним.

Мой вопрос: имеет ли библиотека C# по умолчанию немного лучшую производительность, чем код, который мы пишем? (возможно, он работает в выпуске, а не отлаживается?)

+0

Не могли бы вы опубликовать код, используемый для вашего теста? – Juliet

ответ

4

Реализация .NET была, вероятно, немного лучше, чем ваша, но также, как вы оценили? Несколько миллионов итераций или несколько? Помните, что вам нужно использовать большую тестовую базу, чтобы вы могли исключить некоторые данные (на время выключения процессора и т. Д.), Что даст ложные результаты.

0

Id заявляют, что реализация Microsoft является чуть-чуть лучше вашей. ;)

Вы проверили источник?

2

Люди в Microsoft гораздо умнее, чем вы и я, и, скорее всего, написали лучшую оптимизированную оболочку за Byte[], намного лучше, чем то, что вы или я бы выполнили.

Если вам интересно, я бы предложил вам разобрать типы, которые вы создали, чтобы увидеть, как именно Microsoft их реализовала. В некоторых из наиболее важных областей структуры (например, я предполагаю) вы обнаружите, что BCL обращается к неуправляемому коду для достижения своих целей.

Неуправляемый код имеет гораздо лучшие шансы на превышение управляемого кода в таких случаях, поскольку вы можете свободно работать с массивами без накладных расходов управляемой среды выполнения (для таких вещей, как проверка границ и т. Д.).

2

Многие из каркасных сборок NGENed, что может дать им небольшой импульс, минуя начальное время JIT. Это вряд ли станет причиной разницы в 2 мс, особенно если вы уже разогрели свои методы до запуска секундомера, но я упомянул об этом для полноты.

Кроме того, да, сборки фреймов построены в режиме «выпуска» (оптимизация и проверка), а не «отладка».

+0

Что вы подразумеваете под «проверками»? – TheAJ

+0

C# может выполнять арифметику в проверенном или непроверенном режиме - в режиме проверки переполнения возникает исключение (например, Int32.MaxValue + 1 throws), в непроверенном режиме он будет обертываться (например, Int32.MaxValue + 1 возвращает Int32.MinValue). Режим по умолчанию - это параметр компилятора (он может быть переопределен в коде с помощью отмеченных и непроверенных ключевых слов). Однако, возможно, я ошибался в том, что по умолчанию проверены отладочные сборки - похоже, что отладочные сборки также по умолчанию не отмечены. Извини за это. – itowlson

2

Возможно, вы использовали Array.Copy() вместо более быстрого Buffer.BlockCopy(). Самый быстрый способ - использовать небезопасный код с указателями. Отъезд how they do this в проекте Mono (поиск по memcpy).

Смежные вопросы