Подтвердить что ты не робот

Величина переменной длины важна для производительности С#?

Мне было интересно, если использование длинных описательных имен переменных в WinForms С# имеет значение для производительности? Я задаю этот вопрос, так как в AutoIt v3 (интерпретируемый язык) было показано, что наличие переменных с короткими именами типа aa вместо veryLongVariableName намного быстрее (когда программа больше, чем 5 лайнеров). Мне интересно, так ли это в С#?

4b9b3361

Ответ 1

Нет, нет. Компилятор фактически не сохраняет имена исходных переменных, вы можете посмотреть код IL любой компилируемой сборки с дизассемблером.

Ответ 2

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

Компилятор С# исключает имена идентификаторов в двух разных этапах. Имена локальных переменных стираются и заменяются смещениями фрейма стека при компиляции исходного кода в IL. Пространства имен и имена типов все еще присутствуют в сборке. Компилятор JIT стирает их, заменяя их смещениями кода для методов и смещений данных для полей. Длина имен идентификаторов здесь не имеет значения, поиск происходит только один раз.

Устранить затраты на поиск имени в интерпретаторе не сложно. Порядочный интерпретатор токенизирует исходный код, по сути, предустановленный шаг, чтобы сделать интерпретатор более эффективным. Такой интерпретатор не будет иметь проблемы с замедлением с длинными именами идентификаторов.

Ответ 3

Нет, после компиляции исходные имена переменных больше не используются. Размер имен переменных должен иметь очень небольшое влияние на время компиляции, но не на время выполнения.

Интерпретированные языки затронуты немного длинными именами переменных. Длинные имена больше читаются, сохраняются и просматриваются каждый раз, когда они запускаются, но эффект должен быть очень маленьким. Задержка при чтении/записи на диск или даже экране должна значительно превышать задержку, вызванную более длинными именами переменных.

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

В программировании мало абсолютов, но я уверен, что сокращение названий переменных в исходном коде по соображениям производительности является АБСОЛЮТНО неправильным решением КАЖДОЕ время.

Ответ 4

Нет, я не думаю, что длинная переменная влияет на производительность выполнения приложения .NET. AFAIK, промежуточный код (в MSIL) в сборке .NET, переведен на машинный язык, прежде чем он будет выполнен. Это будет где имена переменных, безусловно, "выбрасываются" (если это еще не произошло ранее) и заменены простыми адресами памяти.

Ответ 5

Это не имеет значения. Несмотря на то, что вы можете получить имена при декомпиляции (см. Другие сообщения для деталей), эти имена не используются инструкцией IL. Чтение или запись в переменные/поля. Переменные и поля идентифицируются с помощью другой конструкции. В пространстве имен reflection.emit они представлены LocalBuilder (для локальной переменной или FieldBuild для полей) и для дальнейшего подчеркивания точки: их даже не нужно явно указывать.

Ответ 6

Я думаю, что вопрос о длине имени действителен только для Script # проектов (в случае перевода С# на JavaScript).