Объект в VB 2010 получил одинаковую оптимизацию, что и динамично в C # 4.0?

StackOverflow https://stackoverflow.com/questions/2628424

Вопрос

Некоторые люди утверждали, что функция C # 4.0, представленная с dynamic Ключевое слово такое же, как «все является объектом» VB. Тем не менее, любой вызов на динамическую переменную будет переведен в делегат один раз, а затем, делегат будет вызываться. Во vb, при использовании Object, Никакой кэширования не применяется, и каждый вызов не напечатанный методом включает в себя многое отражение под вытяжкам, иногда на общую сумму 400-кратный штраф производительности.

Иметь Динамический тип делегата - оптимизация и кэширование Также был добавлен в вызовы методов VB нетяпированных или неразъедных объектов VB еще так медленный?

Это было полезно?

Решение

Решение

Некоторые исследования и лучшее чтение ранее ссылается на статью упоминается от пассажира Ханса, приводит к следующему выводу:

  • VB.NET 2010 поддерживает DLR;
  • Вы можете реализовать IDynamicMetaObjectProvider Если вы хотите явную поддержку динамики, компилятор VB.NET обновляется, чтобы распознать это;
  • VB's. Object будет использовать только для кеширования DLR и метода, если объект реализует IDynamicMetaObjectProvider;
  • BCL и Framework Types не реализуют IDynamicMetaObjectProvider, с использованием Object На таких типах или ваши собственные типы будут вызывать классическую, не кэшируемую VB.Net позднего связующего.

ПРЕДПОСЫЛКА: Разработка того, почему позднее связывание кэширования может помочь повысить производительность кода VB

Некоторые люди (среди которых Ханс Пассант, увидит его ответ), может удивляться, почему кэширование или не кэширование в поздних связывании могут иметь значение. На самом деле, это имеет большое значение, как в VB, так и в других технологиях позаблюдения (помните IQueryInterface с com?).

Поздние привязки сводится к простому принципу: с учетом имени и его параметров-деклараций, цикл через все методы этого класса и его родительские классы с помощью доступных методов, хотя Type Интерфейс (и в VB, метод, свойство и поле может Смотреть То же самое, делая этот процесс даже медленнее). Если вы считаете, что таблицы метода неупорядочены, то это легко намного дороже, чем один прямой (т. Е. Набранный) вызов метода.

Если вы были способны найти метод один раз, а затем хранить указатель метода в таблице поиска, это значительно ускорило бы этот процесс. Привязка кэшированного метода в DLR идет на шаг дальше и заменяет метод-вызов указателем на фактический метод, если это возможно. После первого звонка это становится порядком быстрее для каждого последующего вызова (думайте, что 200x до 800x раз быстрее).

В качестве примера, когда это имеет значение, вот какой-то код, который иллюстрирует эту проблему. В случае, когда у каждого класса есть .Name Свойство String, но классы не разделяют общего предка или интерфейса, вы можете наивно сортировать списки любого из этих типов, таких как:

' in the body of some method '
List<Customers> listCustomers = GetListCustomers()
List<Companies> listCompanies = GetListCompanies()

listCustomers.Sort(MySort.SortByName)
listCompanies.Sort(MySort.SortByName)

' sorting function '
Public Shared Function SortByName(Object obj1, Object obj2) As Integer
    ' for clarity, check for equality and for nothingness removed '    
    return String.Compare(obj1.Name, obj2.Name)    
End Function

Этот код (аналогичный как минимум) фактически сделал его в производство с одним из моих клиентов и использовался в часто называемом обратблении AJAX. Без вручную кэшировать .Name Свойства, уже в списках среднего размера менее половины миллиона объектов, код позднего связывания стал таким заметным бременем, что в конечном итоге он привел весь сайт. Это оказалось трудно отслеживать эту проблему, но это история в другое время. После исправления этого сайт восстановил 95% его процессора.

Итак, ответ на вопрос Ганса «У тебя нет больших проблем, чтобы беспокоиться о» Просто: Это большая проблема (или может быть), особенно к программистам VB, которые стали слишком небрежными по поводу использования позднего привязки.

В этом конкретном случае, и многие, как они, VB.NET 2010, по-видимому, не было модернизировано, чтобы ввести поздние привязки, а как таковые, Object остается злом для не знакомства и не должно сравниться с dynamic.

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

Другие советы

Цитируя из какая новая статья:

Visual Basic 2010 был обновлен для полной поддержки DLR в своем латенинде

Не может быть более явным, чем это. Это DLR, который реализует кэширование.

Хороший вопрос. Я предполагаю, что ответ «нет», потому что Эта статья В MSDN журнал говорит, что VB.NET был изменен для поддержки выполнения динамического языка, и кратко описывает изменения в среду выполнения, но не упоминает кэширование.

Кто-нибудь знает лучше?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top