Почему метод отправки иногда медленный?
Чтение некоторых старых сообщений в caml-списке. Я наткнулся на следующее сообщение Жака Гаррига: http://caml.inria.fr/pub/ml-archives/caml-list/2007/11/24e8215c8d844b05db58ed3f79c9645f.en.html
Цитата, о которой я забочусь, следующая:
Вызов метода на произвольных объектах может быть медленным. Это связано с тем, что из-за подтипирование, в некоторых ситуациях нет способа узнать, где метод будет в таблице, и нужно выполнить двоичный поиск.
Может кто-нибудь объяснить, почему это так? Почему именно подтипирование (наследование, которое я принимаю в этом случае) влияет на это? Это относится к реализации OCaml или к другим языкам страдает от этого?
Пожалуйста, укажите мне дополнительные ресурсы, связанные с этим, Google не справился со мной.
Ответы
Ответ 1
Может ли кто-нибудь объяснить, почему это так?
При номинальной типизации каждому методу может быть присвоено уникальное целое число во время компиляции, поэтому виртуальная функция может быть найдена путем индексирования в массив. При структурной типизации (как в OCaml) это невозможно сделать, так что хэш структуры (то есть имя метода) используется для поиска указателя функции виртуального метода в словаре.
Почему именно подтипирование (наследование, которое я принимаю в этом случае) влияет на это?
Подтипы являются обязательным условием для виртуальной отправки.
Возможно ли это для реализации OCaml или других языков?
Просто реализация OCaml. В F # я использовал генерацию отражения и времени выполнения для достижения такого же эффекта без такого повышения производительности при обращении к времени.
Ответ 2
Я думаю, что delnan комментирует, что в OCaml "Subtyping!= inheritance" содержит представление об объяснении.
$ rlwrap ocaml
OCaml version 4.00.1
# let f o = o#x + o#y ;;
val f : < x : int; y : int; .. > -> int = <fun>
#
Функция f
выше принимает любой объект o
, который имеет методы x : int
и y : int
. Не объекты, которые наследуются от некоторого класса c
, в котором смещение для этих методов могло быть исправлено заранее, заметьте. Любой объект с этими методами. Я предполагаю, что это трудно реализовать, и может быть одним из случаев, о которых Жак ссылается в своем сообщении.