Я могу сравнить код IL для определения, какая техника быстрее или лучше?

От C# 6 вперед: это больше не проблема

<час>

Becore C# 6, необходимо назвать конструктора по умолчанию для этого для работы:

public MyStruct(int size) : this()
{
    Size = size;
}

А большая проблема здесь состоит в том, что у Вас есть изменяемая структура. Это никогда хорошая идея. Я сделал бы его:

public int Size { get; private set; }

Не технически неизменный, но достаточно близко.

С последними версиями C#, можно изменить к лучшему это:

public int Size { get; }

Это может теперь только быть присвоенным в конструкторе.

6
задан Community 23 May 2017 в 11:53
поделиться

2 ответа

  • Верны ли мои предположения для этого конкретного примера?
  • В общем, как мне сравнивать два решения с помощью кода IL?
  • В общем, подходит ли решение с меньшим количеством IL? LOC означает, что он будет быстрее или потреблять меньше памяти?
  • Как сказано в заголовке: Могу ли я сравнить код IL, чтобы определить, какой метод быстрее или лучше?

1) Ваши предположения о том, что происходит, верны.

2) Вам необходимо понять, что делает код IL, чтобы определить, что «лучше»

3) Нет. Это означает, что для выполнения требуется меньше инструкций. Однако эти отдельные инструкции могут использовать больше или меньше памяти. Например, инструкция, на которую вы ссылаетесь, в одном случае создает делегат Func, а в другом создает объект Converter. Без дополнительной информации это ' трудно сказать, какая из этих двух вещей дороже.

4) Да и нет ....

Проблема в том, что код IL скажет вам, что происходит, но на самом деле это вложенные вызовы в IL, которые будут большим драйвером производительности. Если код IL выполняет простые операции повсюду, в целом, чем короче, тем лучше (хотя отдельные операции IL могут различаться по скорости сами по себе). Когда код вызывает методы или конструкторы других типов, таких как ваш, это невозможно сказать только по одному этому. Одна строка IL может занять больше времени в одном случае (например, если она вызывает дорогостоящий метод), чем 50 в другом случае (где они выполняют простые операции).

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

4) Да и нет ....

Проблема в том, что код IL скажет вам, что происходит, но на самом деле именно вложенные вызовы в IL будут большим драйвером производительности. Если код IL выполняет простые операции повсюду, в целом, чем короче, тем лучше (хотя отдельные операции IL могут различаться по скорости сами по себе). Когда код вызывает методы или конструкторы других типов, таких как ваш, это невозможно сказать только по одному этому. Одна строка IL может занять больше времени в одном случае (например, если она вызывает дорогостоящий метод), чем 50 в другом случае (где они выполняют простые операции).

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

4) Да и нет ....

Проблема в том, что код IL скажет вам, что происходит, но на самом деле именно вложенные вызовы в IL будут большим драйвером производительности. Если код IL выполняет простые операции повсюду, в целом, чем короче, тем лучше (хотя отдельные операции IL могут различаться по скорости сами по себе). Когда код вызывает методы или конструкторы других типов, таких как ваш, это невозможно сказать только по одному этому. Одна строка IL может занять больше времени в одном случае (например, если она вызывает дорогостоящий метод), чем 50 в другом случае (где они выполняют простые операции).

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

Проблема в том, что код IL скажет вам, что происходит, но на самом деле именно вложенные вызовы в IL будут большим драйвером производительности. Если код IL выполняет простые операции повсюду, в целом, чем короче, тем лучше (хотя отдельные операции IL могут различаться по скорости сами по себе). Когда код вызывает методы или конструкторы других типов, таких как ваш, это невозможно сказать только по одному этому. Одна строка IL может занять больше времени в одном случае (например, если она вызывает дорогостоящий метод), чем 50 в другом случае (где они выполняют простые операции).

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

Проблема в том, что код IL скажет вам, что происходит, но на самом деле именно вложенные вызовы в IL будут большим драйвером производительности. Если код IL выполняет простые операции повсюду, в целом, чем короче, тем лучше (хотя отдельные операции IL могут различаться по скорости сами по себе). Когда код вызывает методы или конструкторы других типов, таких как ваш, это невозможно сказать только по одному этому. Одна строка IL может занять больше времени в одном случае (например, если она вызывает дорогостоящий метод), чем 50 в другом случае (где они выполняют простые операции).

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

Это действительно вложенные вызовы в IL, которые будут большим драйвером производительности. Если код IL выполняет простые операции повсюду, в целом, чем короче, тем лучше (хотя отдельные операции IL могут различаться по скорости сами по себе). Когда код вызывает методы или конструкторы других типов, таких как ваш, это невозможно сказать только по одному этому. Одна строка IL может занять больше времени в одном случае (например, если она вызывает дорогостоящий метод), чем 50 в другом случае (где они выполняют простые операции).

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

Это действительно вложенные вызовы в IL, которые будут большим драйвером производительности. Если код IL выполняет простые операции повсюду, в целом, чем короче, тем лучше (хотя отдельные операции IL могут различаться по скорости сами по себе). Когда код вызывает методы или конструкторы других типов, таких как ваш, это невозможно сказать только по одному этому. Одна строка IL может занять больше времени в одном случае (например, если она вызывает дорогостоящий метод), чем 50 в другом случае (где они выполняют простые операции).

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

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

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

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

В вашем случае выше, например, первые 20 операции выполняются очень, очень быстро, тогда как последние несколько занимают почти все ваше исполняемое время.

8
ответ дан 9 December 2019 в 22:37
поделиться

Часть работы для обоих ответов выполняется на IL 004A (и IL 004F для второго). Если вам не известна стоимость этих внешних вызовов, нет никакой практической основы, на которой вы могли бы сравнить эффективность двух ответов.

3
ответ дан 9 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

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