Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странное поведение calli в IL 
:(
    Опции темы
megel
Дата 28.1.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 31.5.2008

Репутация: нет
Всего: нет



при написании генератора враппера для opengl сталкнулся с такой вещью:

Если вызывать unmanaged фукцию (через Reflection.Emit Opcodes.calli) из её адресса (GetProcAdress) то нужно использовать 
CallingConversion.Stdcall , скорость вызова функции на 300% медленее чем pinvoke.

А если использовать CallingConversion.Default то скорость вызова на 500% быстрее pinvokе!
По идее фукция не должна вызываться, но она вызывается. причем фича работает только если
первый аргумент статической функции является адресс unmaged фукции. 

Код

  .method public static void Function(int32 functionPtr, int32 parameter) cil managed 
  { 
    ldarg.1    
    ldarg.0
    calli void (int32)
    ret
  } 


и никак иначе. при добавление любого кода в функцию, она не вызывается(но не выдает ощибку).

Например

 
Код

 .method public static void Clear(int32 functionPtr, int32 parameter) cil managed 
  { 
    .maxstack 8
    .locals ( [0] int32 ptr)

    ldarg.0
    stloc.0

    ldarg.1    
    ldloc.0
    calli void (int32)
    ret
  } 


уже не работает. 
Кто может обьяснить в чем дело?
Ведь если использовать эту штуку то вызов Unmanaged функции идет почти в 5 раз быстрее.
Цифры в процента очень примерные.
версия фремворка 3.5

Это сообщение отредактировал(а) megel - 28.1.2010, 15:56
PM MAIL   Вверх
ns4107
Дата 12.2.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.6.2009

Репутация: нет
Всего: нет




Добавлено @ 15:20
2. попробуй
ldarg.1
ldarg.0
stloc.0
ldloc.0
..... 

Это сообщение отредактировал(а) ns4107 - 12.2.2010, 17:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0396 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.