powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Позднее vs раннее связывание
25 сообщений из 26, страница 1 из 2
Позднее vs раннее связывание
    #32294409
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафлудили мы с Senin Viktor в топике Vinni, поэтому выношу вопрос в отдельный топик. \r
\r
Что лучше: мучиться с references, но получить возможность проверки синтаксиса и возможно более высокую скорость(не проверял) при раннем связывании или воспользоваться более гибким средством позднего связывания?
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294437
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я свои 5 копеек уже вставил, см. тама

Добавлю еще одну особенность, обнаруженную недавно.
Возьмем на примере Excell.
Все функции (мои), использующие работу с Excell-ем вынесены в отдельный модуль.
Ссылка на Excell в списке ссылок последняя по приоритету.
Так вот даже если на компьютере не установлен Excell приложение нормально работает, если не обращаться к функциям из модуля по работе с Excell.

Но...кроме одного случая, если в свойстве какого-либо элемента формы не указана функция из модуля этой формы.
....поскольку не всем понятно объясню на примере:
в модуле формы есть функция myfunc()
в конструкторе на поле в событие AfterUpdate ставим =myfunc()
на компьютере с установленным Excell все работает, без него не работает.
если же функция myfunc() находится в глобальном модуле, то все работает вне зависимости от наличия Excell

P.S. Кто там писал фак по недокументированным фичам, можно добавить.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294462
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Про недокументированные фичи писал я, но разрешаю добавлять всем. :^)

Только, по-моему, этот случай - не в тему. Я-то перечислял случаи, когда есть какая-то возможность, о которой никто не знает. А тут - ну ведь и так понятно, что если какой-то ссылки не хватает, то будет то работать, то не работать.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294594
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, к своей базе прикладываете DLL, в такой ситуации, я думаю, позднее связывание предпочтительнее. Программа спокойно проверяет наличие DLL, если нет, то извлекает из таблицы бинарник и записывает на диск, регистрирует библиотеку и все так чинно, благородно :-) и в MDB и в MDE.
И нет воплей, что используются неизвестные функции Format, или Left etc.
С такими ошибками и до проверки IsBroken можно не добраться. Да и на отсутствие файла не всегда бывает IsBroken, бывают и другие ошибки при проверке: ошибка загрузки dll и др.
Вообще работа с ссылками не всегда проходит гладко. Ставишь ссылку на Office 10, а у клиента почему-то подключается 8 (видел своими глазами).
Наблюдал и более неприятные глюки.
Да, при программировании удобно подключить библиотеки, а потом ...
Cкорость работы ниже? А не уверен. Да, время затратиться на подключение, а потом, по моему, скорости работы одинаковы
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294604
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
, при программировании удобно подключить библиотеки, а потом ...

Потом заменить строку
Dim XLS As New Excel.Application

на

Dim XLS As Object
и добавить CreateObject

Теперь можно спокойно снять галку и избавиться от потенциальной проблемы.

----------
Одним словом раннее связывание может и хорошо, однако глючная реализация в VBA сводит на нет ее достоинства.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294624
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, кто-нибудь знает имеются ли файлы с константами(xlCenter, xlRight ..) для ADO такой имеется, а для офиса? Сейчас я их достаю с помощью VC и директивы #import.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294685
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Incold \r
> У некоторых стоит Runtime Access на голой ОС (в целях экономии на лицензиях) и они занимаются только тем, что вколачивают данные в базу, никаких Word, Excell не собираются использовать (хотя в программе заложена такая возможность (цитата из url=/topic/53752]топика Vinni) \r
\r
Если была бы такая задача - то да. Тем более, что (грубо говоря) отключить ссылки и поставить вместо Dim xl as Excel.Application - Dim xl as Object : set xl=GetObject(...) труда со всем не составит. Но я к своему стыду (или счастью? :) ни разу RunTime нигде не ставил, и ничего под него не творил.\r
\r
2 Incold \r
> Так вот даже если на компьютере не установлен Excell приложение нормально работает, если не обращаться к функциям из модуля по работе с Excell. \r
\r
Интересно. Жалко смоделировать не могу - Екцёль жалко :)\r
Т.е. есть Акес как бы ломается частично, по модульно?\r
\r
2 Саныч \r
> А тут - ну ведь и так понятно, что если какой-то ссылки не хватает, то будет то работать, то не работать. \r
\r
Эээ нет, Саныч, не соглашусь с тобой\r
Если замечание incold - есть Истина, то теперь мы (я, он, она :) обладаем знанием - где что сломается впервую очередь, если будет не верная ссылка и поэтому можно хотя бы процедуру проверки ссылок (IsBroken) вынести в модуль в котором нет кода на подверженные "слету" ссылок. \r
\r
\r
2 Serge Gavrilov \r
Интересный механизм :) правда лишний, если использовать установщик, поддерживающий WindowsInstaler (этот гад даже ярлыки мне восстанавливал :)\r
\r
>С такими ошибками и до проверки IsBroken можно не добраться\r
C этим согласен, но замечание incold может свести такую проблему до минимума\r
>Cкорость работы ниже? А не уверен\r
Тьма примеров (книги, микрософт) уверяют в обратном. Щас маленьий тестик слабаю - интересно. Ёкцел сгодиться?\r
\r
==\r
Извините за многословность :)
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294694
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
О. Мы, конечно, обладаем знанием. Я ж с этим не спорю. Я только говорю, что это не относится к теме "Недокументированные фичи".
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294698
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сенин Виктор писал:поэтому можно хотя бы процедуру проверки ссылок (IsBroken) вынести в модуль в котором нет кода на подверженные "слету" ссылок
Ну дык ведь модули подгружаются (и компилируются) именно модулями.

Сенин Виктор писал:Тьма примеров (книги, микрософт) уверяют в обратном. Щас маленьий тестик слабаю - интересно. Ёкцел сгодиться?
Тьма примеров (книг и майкрософта) еще говорят, что обращение к COM-серверу в exe тормозит само по себе. Так что именно на экселе ты и получишь, что, хоть и будет медленнее, но на это можно положить ибо маршалинг все сожрет.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294700
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто-нибудь придумает пример по лучше
Я только такой придумал/ Результат меня огорчил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
Option Compare Database
Option Explicit

Private Declare Function timeGetTime Lib  "winmm.dll"  () As Long
Private Sub Test1()
    Dim i           As Long
    Dim t           As Long
    t = timeGetTime

    For i =  1  To  10 
        Dim xl      As Excel.Application
        Dim wb      As Excel.Workbook
        Dim ws      As Excel.Worksheet
        Set xl = New Excel.Application
        Set wb = xl.Workbooks.Add
        Set ws = wb.Worksheets( 1 )    'хоть одно да создалась
        'без with специально
        ws.Range( "A1" ).Value =  1 
        ws.Range( "A2" ).Value =  11 
        ws.Range( "A3" ).Value =  111 
        ws.Range( "A4" ).Value =  1111 
        ws.Range( "A5" ).Value =  11111 
        ws.Range( "A6" ).Value =  111111 
        ws.Range( "A7" ).Value =  1111111 
        ws.Range( "A8" ).Value =  11111111 
        ws.Range( "A9" ).Value =  111111111 
        ws.Range( "A10" ).Value =  111111111 
        ws.Range( "A11" ).Formula =  "=Sum(A1:A10)" 
        Set ws = Nothing
        wb.Close SaveChanges:=False
        Set ws = Nothing
        xl.Quit    ' вообще-то тут я не уверен в правильности расчетов. Поидее сильно завииитот диска и ОП
        Set xl = Nothing
    Next i
Debug.Print (timeGetTime - t) / 1000

    'Первый запуск после рестарта Акеса   3 , 812  (с)
    '3,546
    '3, 687 
    '3,391
    '3, 734 
    '3,406
    '
    '
End Sub
Private Sub Test2()
    Dim i           As Long
    Dim t           As Long
    t = timeGetTime

    For i = 1 To 10
        Dim xl      As Object
        Dim wb      As Object
        Dim ws      As Object
        Set xl = CreateObject("Excel.Application")
        Set wb = xl.Workbooks.Add
        Set ws = wb.Worksheets(1)    'хоть одно да создалась
        'без with специально
        ws.Range("A1").Value = 1
        ws.Range("A2").Value = 11
        ws.Range("A3").Value = 111
        ws.Range("A4").Value = 1111
        ws.Range("A5").Value = 11111
        ws.Range("A6").Value = 111111
        ws.Range("A7").Value = 1111111
        ws.Range("A8").Value = 11111111
        ws.Range("A9").Value = 111111111
        ws.Range("A10").Value = 111111111
        ws.Range("A11").Formula = "=Sum(A1:A10)"
        Set ws = Nothing
        wb.Close SaveChanges:=False
        Set ws = Nothing
        xl.Quit    ' вообще-то тут я не уверен в правильности расчетов. По идее сильно зависит от диска и ОП
        Set xl = Nothing
    Next i
Debug.Print (timeGetTime - t) /  1000 
    'Первый запуск после рестарта Акеса   3,546
    '3, 5 
    '3,234
    '3, 485 
    '3,219
    '3, 5 
End Sub

...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294701
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ЛП

к своему стыду не знаю значения загадочного слова "маршалинг" и поэтому мало что понял :(
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294708
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сервер находится в dll - ты можешь работать со всеми данными всех объектов обращаясь напрямую к нужным кускам памяти, ибо находишься в том же самом адресном пространстве. И вызовы всяких методов, и обращения к пропертям происходит быстро.

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

Объяснение на пальцах, знатоки - не ругайтесь

Результаты твой теста именно это и показывают - накладные расходы на позднее связывание не заметны на фоне накладных расходов на маршалинг.
Можно проверить на каком-нибудь сервер в dll. То же самое ado. Хотя нет, работая с ado накладные расходы на операции с базой данных (тем более если по сети) тпять таки задавят расходы на связывание.
Если интересно проверить именно позднее связывание vs раннее - создать свой модуль класса, сделай в нем простейший метод, и повызывай этот метод в цикле. Сначала опиши экземпляр класса как MySuperPuperClass, а потом как Object.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294909
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ЛП

Спасибо за объяснения про маршалинг
==
Надо все-таки добить тему
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294961
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаем класс TestClass. В нем делаем метод TestMethod, совершенно пустой и ничего не делающий.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Public Function test()
    Dim i As Long
    Dim t As Single
    
    Dim objTest As Object
    Set objTest = New TestClass
    
    t = Timer
    For i =  1  To  1000000 
        objTest.TestMethod
    Next i
    Debug.Print  "Позднее связывание "  & Timer - t,
    
    Dim clsTest As TestClass
    Set clsTest = New TestClass
    t = Timer
    For i =  1  To  1000000 
        clsTest.TestMethod
    Next i
    Debug.Print  "Раннее связывание "  & Timer - t
End Function

Результат работы
Код: plaintext
1.
2.
3.
4.
Позднее связывание  4 . 335938  Раннее связывание  0 . 421875 
Позднее связывание  4 . 335938  Раннее связывание  0 . 4179688 
Позднее связывание  4 . 335938  Раннее связывание  0 . 4101563 
Позднее связывание  4 . 316406  Раннее связывание  0 . 4179688 
Позднее связывание  4 . 324219  Раннее связывание  0 . 4101563 


Так что теоретически позднее связывание медленнее. Практически же на это можно забить.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32294978
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стр.631-638 т.1
хотя там мало нового,
кроме того, что уже
здесь говорилось
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295072
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за тест.
Да, со скоростью согласен, позднее связывание сильно проигрывает.
Конечно это надо учитывать.
Я также проверил скорость на вызове метода TestMethod из dll.
Интересно, что при раннем связывании вызов метода класса из DLL у меня получился в три раза быстрее чем вызов метода из собственного класса. При позднем связывании вызов метода класса из DLL тоже происходит быстрее, но не так значительно.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295175
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Serge Gavrilov
Да не проигрывает позднее связывание по скорости.
Если, конечно, не рассматривать случай сферических коней в вакууме. А то что я привел - это именно сферический конь в вакууме.
Пример Сенина Виктора показывает, что в случае сервера в exe (эксель) пофиг какой тип связывания.
Можно погонять ado-шные объекты, поглядеть как себя ведут несферические кони в dll.

По поводу "TestMethod из dll" - на чем писал? Если на VB - во что компилил, native или P-code?
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295257
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To ЛП:
VB 6, ActiveX DLL, Native code
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295264
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда я был молодым и дырявил перфокарты бритвой, чтобы поменять начальные условия в счетной задаче, процесс работы с программой состоял из 3-х этапов:
1. "Трансляция" (компиляция с языка программирования-этап Compile)
2. "Редактирование" (имеется в виду редактирование связей, разрешение внешних ссылок - этап Link)
3. Собственно "Счет" - Run

Насколько я понимал и сейчас понимаю эти процессы, компилятор плодит код в инструкциях ассемблера, допуская при этом наличие внешних ссылок. Редактор связей создает модуль практически в относительных адресах кроме ссылок на функции ядра ОС. После редактора связей при загрузке программа просто получает смещение в памяти и начинает выполняется.

Из рассмотренного видно, что работа Link "не тормозит", если все внешние ссылки находятся в ядре ОС, т.е. как бы все время загружены в память. Соответственно, скорости "поздего" и "раннего" связывания могут быть сопоставимы только если скорость доступа по внешним ссылкам, обрабатываемым "на лету", пренебрежимо мала т.е. сопоставима со скоростью доступа к резидентным функциям ОС.

Неужели эксель весь в памяти сидит?
Во техника-то продвинулась...
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295280
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Serge Gavrilov
Если не сложно - проверь в случае компиляции в P-code. Просто интересно. Я бы и сам, да VB нихт.

2 Лифчик
А ты возьми да погляди сколько того экселя в памяти
На самом деле позднее связывание тормозит (см. мой тест), но это незаметно на фоне переброски данных между разными адресными пространствами, переключения контекстов и т.п. (см. тест Сенина Виктора)
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295307
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох: тады я согласен на 100%, что источник тормоза есть винды изначальные
. Правда камни быстрые пока выручают. Но это только пока...
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295380
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Комп у меня потормознее видимо :(
Процедура и класс такие же.

TestBindingNativecodeDLL
Раннее связывание 0,28125
Позднее связывание 10,08594

TestBindingPCodeDLL
Раннее связывание 0,578125
Позднее связывание 11,54688

TestBindingOwnClass
Раннее связывание 0,7539063
Позднее связывание 12,29688
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295412
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... куда уж тормознее... я и так на тысячном селероне сижу.

За результаты теста сенькс. Оно примерно так и ожидалось. Хотя думал что отличие P-Code от собственного класса будет поменьше.
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295481
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня стабильно //тест ЛП
Код: plaintext
1.
2.
3.
Позднее связывание  1 , 671875  Раннее связывание  0 , 1875 
Позднее связывание  1 , 65625   Раннее связывание  0 , 203125 
Позднее связывание  1 , 671875  Раннее связывание  0 , 1875 


2Лифчик
>Неужели эксель весь в памяти сидит?
>Во техника-то продвинулась...

А в Автозагрузке есть "C:\Program Files\Microsoft Office\Office\OSA9.EXE" ?

The Office Startup Assistant (OSA9.exe or OSA9) is a program that improves the
performance of Office 2000 programs
...
The OSA9.exe file does the following:
- Initializes Automation
- Initializes some of the common fonts installed by Office 2000
- Handles certain commands (New Office Document, Find Fast, Open Office Document, Help, and Screen Saver) on the Start menu and on the Office Shortcut Bar
- Displays Microsoft Outlook notifications when the Office Assistant is available
...

//MSDN:OFF2000: What Is the OSA9.exe File and What Does It Do?
...
Рейтинг: 0 / 0
Позднее vs раннее связывание
    #32295706
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senin Vik(c)tor: - Initializes Automation

Прочитал тут пару страниц в Гетце и показалось мне, что раннее и позднее связывание различаются нюансами интерфейса. Т.е. в обоих случаях речь не идет об объектах, для которых уже память выделена (на старом языке - оттранслированный и отредактированный модуль). Так что разница в скоростях не должна быть на порядок. И тогда маршаллинг всех забьет, когда парад свой устроит
Шкварчать будет машинка всеми дисками своей души и моргать всеми своими глазками- оконцами
Все конечно с поправкой на ИМХО, а я есть Лифчик, известный в узких кругах ретроград
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Позднее vs раннее связывание
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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