Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сверхбыстрый CopyMemory от Agner Fog / 7 сообщений из 7, страница 1 из 1
27.06.2015, 23:24
    #38994398
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сверхбыстрый CopyMemory от Agner Fog
Пытаюсь заюзать библиотеку asmlib http://www.agner.org/optimize/ от гуру оптимизации Agner Fog. Смысл в том, что либа определяет тип процессора, и выполняет код с использованием SSE2-SSE4, в некоторых случая в 6 раз быстрее чем стандартные сишные функции, которые никаких новых инструкций процессора не используют.

Сначала линкую библиотеку libacof32.lib к пустому ActiveX DLL проекту или к самому экзешнику, без разницы.

Код: vbnet
1.
2.
[VBCompiler]
LinkSwitches= "libacof32.lib" /EXPORT:A_memcpy



Экспортируется функция A_memcpy:

Код: plaintext
1.
void * A_memcpy(void * dest, const void * src, size_t count);



В списке экспорта DLL/EXE файла она появляется.

Затемы вызываю ее.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Option Explicit
Private Declare Sub CopyMemory Lib "asmlibDll.dll" Alias "A_memcpy" (ByVal lpvDest As Long, ByVal lpvSource As Long, ByVal cbCopy As Long)
Private Sub Command_Click()
    Dim z As Long
    Dim b As Long
    z = 1234
    CopyMemory VarPtr(b), VarPtr(z), 4
    MsgBox b
End Sub



Код работает только в скомпилированном EXE, а при запуске из IDE - авторBad Dll calling convertion

Что vb нравится?
...
Рейтинг: 0 / 0
27.06.2015, 23:53
    #38994400
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сверхбыстрый CopyMemory от Agner Fog
Eolt,

Соглашение вызова? Похоже что не StdCall.
...
Рейтинг: 0 / 0
27.06.2015, 23:56
    #38994401
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сверхбыстрый CopyMemory от Agner Fog
Пока вот так извратился:

Прилинковал libacof32.lib к asmlibDll проекту, в DLL вызываю функцию из самого себя и экспортирую ее в проект через метод класса.
Работает и в отладке и в экзешнике. Только непонятно как это скажется на скорости вызова A_memcpy, думаю что не самым лучшим образом...


Код: vbnet
1.
2.
3.
4.
5.
Private Declare Sub CopyMemory Lib "asmlibDll.dll" Alias "A_memcpy" (ByVal lpvDest As Long, ByVal lpvSource As Long, ByVal cbCopy As Long)

Public Sub asmCopyMemory(lpvDest As Long, lpvSource As Long, ByVal cbCopy As Long)
    CopyMemory lpvDest, lpvSource, cbCopy
End Sub
...
Рейтинг: 0 / 0
27.06.2015, 23:57
    #38994404
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сверхбыстрый CopyMemory от Agner Fog
ATM-TURBO 2Eolt,

Соглашение вызова? Похоже что не StdCall.

Cdecl в IDE и в скопилированном коде пишет что Bad Dll calling convertion.
...
Рейтинг: 0 / 0
28.06.2015, 00:04
    #38994406
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сверхбыстрый CopyMemory от Agner Fog
Eolt,

CDecl ты можешь заюзать если объявишь в TLB, но это будет работать только в скомпилированном виде, зато без всяких лишних нагрузок. Для теста можешь через DispCallFunc вызывать из IDE. Вот пример, только смени CC_STDCALL на CC_CDECL.
...
Рейтинг: 0 / 0
28.06.2015, 00:14
    #38994407
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сверхбыстрый CopyMemory от Agner Fog
ATM-TURBO 2Eolt,

CDecl ты можешь заюзать если объявишь в TLB, но это будет работать только в скомпилированном виде

А тот CDecl который, что в VB можно объявить, он что "неправильный"
...
Рейтинг: 0 / 0
28.06.2015, 00:17
    #38994408
ATM-TURBO 2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сверхбыстрый CopyMemory от Agner Fog
Eolt,

Нет, он не будет работать. Если ты скомпилируешь приложение с таким CDecl'ом он тупо вставит ошибку в код даже не вызывая функции.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сверхбыстрый CopyMemory от Agner Fog / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]