Насколько дороги в .NET точки?

2

В прошлом на землях C и С++ разнесение разложенных указателей считалось некоторыми из них относительно дорогостоящими операциями, если они выполнялись в замкнутом цикле.

Вы не хотите, чтобы вас поймали:


for (int i = 0; i < 10000000; i++)
{
  j->k->l->m->n->o->p->dosomeworknowthatwereherewhynoteh();
}

потому что вы можете потерять драгоценные миллисекунды. (Да, я немного саркастичен!)

Перемещение в мир .NET...

Это дороже


System.Runtime.InteropServices.Marshal.WriteInt32(Abort, 1)

чем это?


Imports System.Runtime.InteropServices.Marshal
.
.
.
WriteInt32(Abort, 1)
  • 4
    Это не совсем ответ, поэтому я добавлю его в качестве комментария. Что вы можете сделать, это написать две одинаковые программы, за исключением Imports, как вы указали. Скомпилируйте каждый, затем посмотрите на разборку IL, обратите внимание на различия. Это единственный важный способ убедительно обосновать свое мнение.
Теги:
pointers

6 ответов

26
Лучший ответ

Это сравнение яблок и апельсинов.

System.Runtime.InteropServices.Marshal.WriteInt32(Abort, 1)

эквивалентен этому в С++:

Foo::Bar::Baz::Func(a, b);

Другими словами, пространства имен сводятся к нулю с помощью компилятора.

Чтобы получить что-то эквивалентное, у вас может быть что-то вроде этого:

public class Foo {
    public Person Agent { get; }
}

Foo f = getFooFromWhereEver();
f.Agent.Name.ToString().ToLower();

В этом случае представьте, что Person имеет свойство Name, которое является строкой. В этом случае цепочка точек выполняет четыре вызова метода, по крайней мере один из которых является виртуальным, но, скорее всего, не все из них являются инвариантными, поэтому их многократное обращение избыточно. Я говорю "скорее...", потому что это зависит от реализации агента и человека.

  • 0
    Вы правы, яблоки и апельсины, но мне нужен был пример, чтобы доказать указатель на коллегу. Благодарю.
  • 0
    Добавлено в более подходящее сравнение.
9

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

Эти два должны иметь одинаковую производительность:

System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string>();
// using System.Collections.Generic
List<string> myList = new List<string>();

При одновременном доступе к свойству свойства свойства может стоить:

for (int i = 0; i < 100000; i++)
{
    int n = this.ActiveControl.Size.Width;
}
// this should be faster
int width = this.ActiveControl.Size.Width;
for (int i = 0; i < 100000; i++)
{
    int n = width;
}
  • 0
    Компилятор почти всегда достаточно умен, чтобы выполнять такие оптимизации, однако ваша точка зрения верна :)
5

в вашем примере с импортом нет разницы. Оператор import просто гарантирует, что вам не нужно вводить полный путь каждый раз.

однако, если вы написали:

 for(i=0; i<10000; i++)
 {
      classInstance.memberclass.memberclass.memberclass.memberclass.writeInt32(bla);
 }

то да, вероятно, было бы лучше написать:

 SomeClass someclass = classInstance.memberclass.memberclass.memberclass.memberclass;
 for(i=0; i<10000; i++)
 {
      someClass.writeInt32(bla);
 }
4

Он разрешен компилятором, поэтому производительность идентична.

1

Собственно, в обоих ваших двух случаях я ожидаю, что результаты будут равны.

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

0

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

http://akashkava.com/blog/?p=95

Однако моя статья делает различные вычисления, она также вычисляет namedvaluecollection и время доступа к ресурсам и т.д. Но может быть полезно понять, как все работает.

  • 0
    Я думаю, что все отметки должны обязательно дать некоторые комментарии и показать свое лицо. Я ценю честность и обратную связь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню