Вызовы методов COM объекта
От: Константин Быченков  
Дата: 25.04.02 08:50
Оценка:
Создаю СОМ-объект, вызываю его методы.

Вопрос № 1

Dim MyAbakus As New XAbakus
MyAbakus.Init "D:\Base\BASE.GDB", "admin", "q"
MyAbakus.itGetInternetTraffic "tex", "30.01.2002", "01.02.2003", 50
MyAbakus.itReady

Иногда (не всегда) при вызове метода Init происходит ошибка "не найен метод"
Если сделать так

Dim MyAbakus As New XAbakus
MyAbakus.itReady
MyAbakus.Init "D:\Base\BASE.GDB", "admin", "q"
MyAbakus.itGetInternetTraffic "tex", "30.01.2002", "01.02.2003", 50

то ошибка никогда не возникает. В чем тут секрет?
Re: Вызовы методов COM объекта
От: al Россия  
Дата: 25.04.02 09:53
Оценка: 5 (1)
99,9% — глюк в самом Init.
P.S. Использование оператора New в операторе Dim снижает призводительность программы


Re[2]: Вызовы методов COM объекта
От: CTPEKO3A Великобритания  
Дата: 29.04.02 12:47
Оценка:
Здравствуйте al, Вы писали:

al>P.S. Использование оператора New в операторе Dim снижает призводительность программы


Это почему?
It's nice to be important, but it's more important to be nice.
Re[3]: Вызовы методов COM объекта
От: al Россия  
Дата: 29.04.02 13:40
Оценка: 20 (2)
Здравствуйте CTPEKO3A, Вы писали:

CTPEKOA>Здравствуйте al, Вы писали:

al>>P.S. Использование оператора New в операторе Dim снижает призводительность программы


CTPEKOA>Это почему?

Общеизвестный факт. Бейсик в случае New в Dim работает примерно так:


Dim a as New MyClass

....

a.Caption="Test"
' реально бейсик интерпретирует это как If a Is Nothing Then Set a = New MyClass : a.Caption = "Test"

a.MyMethod
' и опять VB делает - If a Is Nothing Then Set a = New MyClass : a.MyMethod


Другими словами, использование New в операторе Dim не приводит к немедленному созданию объекта, а откладывает его
создание до первого к нему обращения. Т.к. понять, в каком месте это первое обращение призойдет VB не может, то он
генерирует код проверки перед каждым обращением к объекту. Это и является причиной замедления работы.

Убедиться в таком поведении VB поможет такой пример:


' в классе Class1
Option Explicit

Public Sub Test()
    MsgBox "Test"
End Sub

Private Sub Class_Initialize()
    MsgBox "Class_Initialize"
End Sub


' в форме
Option Explicit

Private Sub Form_Load()
    Dim a As New Class1
    MsgBox "Dim a As New Class1"
    a.Test
End Sub


У меня (VB6,SP5) последовательность сообщений — "Dim a As New Class1" — "Class_Initialize" — "Test"

Если бы VB создавал обект в операторе Dim .. As New, то последовательность была-бы другой: "Class_Initialize" — "Dim a As New Class1" — "Test"


Re[4]: Вызовы методов COM объекта
От: CTPEKO3A Великобритания  
Дата: 29.04.02 13:53
Оценка:
Здравствуйте al, Вы писали:

al>Здравствуйте CTPEKO3A, Вы писали:


CTPEKOA>>Здравствуйте al, Вы писали:

al>>>P.S. Использование оператора New в операторе Dim снижает призводительность программы


CTPEKOA>>Это почему?

al>Общеизвестный факт. Бейсик в случае New в Dim работает примерно так:


Хорошо, но как это влияет на производительность программы?

Какая мне разница, когда объект будет создан — тогда, когда я впервые обращусь к его методу или когда-то заранее? Ведь совершенно одинаковое время потребуется для создания объекта в любом случае.

И, с другой стороны, вы себе представляете в какой машинный код преобразуется проверка If a Is Nothing Then? Мне почему-то кажется что это что-то вполне атомарное, чем можно пренебречь. Вот если вы создаёте сотни объектов или что-то подобное, то да, тогда будет заметно. А если нет — то зачем?
It's nice to be important, but it's more important to be nice.
Re[5]: Вызовы методов COM объекта
От: al Россия  
Дата: 29.04.02 14:40
Оценка:
Здравствуйте CTPEKO3A, Вы писали:

CTPEKOA>Здравствуйте al, Вы писали:

al>>Здравствуйте CTPEKO3A, Вы писали:


CTPEKOA>>>Здравствуйте al, Вы писали:

al>>>>P.S. Использование оператора New в операторе Dim снижает призводительность программы


CTPEKOA>>>Это почему?

al>>Общеизвестный факт. Бейсик в случае New в Dim работает примерно так:


CTPEKOA>Хорошо, но как это влияет на производительность программы?

Выполнение лишнего If занимает некторое время. В некоторых случаях это может быть критично.
Если есть возможность писать более быстрый код без особых извращений, то наверное это стоит делать всегда. Например, не так сложно писать:

Dim A As MyObject : Set A = New MyObject, вместо Dim A As New MyObject.

Танньше я иногда использовал Dim ... As New .. для создания временных обектов в коде. Но теперь мне больше нравиться использовать With New. Так, пример из корневого вопроса можно представить так:


with New XAbakus ' вместо Dim MyAbakus As New XAbakus 
  .Init "D:\Base\BASE.GDB", "admin", "q" 
  .itGetInternetTraffic "tex", "30.01.2002", "01.02.2003", 50 
  .itReady 
end with


Кроме ускорения (в этом случае, конечно, принебрежимо малого) я избавляюсь от временной
переменной и необходимости писать Set ... = Nothing, когда эта переменная будет не нужна,
"стремление к совершенству" не посзволит мне больше занимать память ненужным объектом.

CTPEKOA>И, с другой стороны, вы себе представляете в какой машинный код преобразуется проверка If a Is Nothing Then? Мне почему-то кажется что это что-то вполне атомарное, чем можно пренебречь. Вот если вы создаёте сотни объектов или что-то подобное, то да, тогда будет заметно. А если нет — то зачем?

Как говориться, лишь бы поспорить. Я так поянл (из предыдущего вопроса), что вы не знали
об этом свойстве VB. Так какя у вас есть гарантия, что вы не будете создавать сотни объектов или что-то подобное при помощи Dim .. As New ..? Вот теперь наверное не будете.


Re[6]: Дельта времени есть, и это главное.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 29.04.02 14:56
Оценка:
Здравствуйте al и CTPEKO3A, Вы писали:

CTP>Хорошо, но как это влияет на производительность программы?


al>Выполнение лишнего If занимает некторое время. В некоторых случаях это может быть критично.


CTP>И, с другой стороны, вы себе представляете в какой машинный код преобразуется проверка If a Is Nothing Then? Мне почему-то кажется что это что-то вполне атомарное, чем можно пренебречь. Вот если вы создаёте сотни объектов или что-то подобное, то да, тогда будет заметно. А если нет — то зачем?


al>Так какя у вас есть гарантия, что вы не будете создавать сотни объектов или что-то подобное при помощи Dim .. As New ..? Вот теперь наверное не будете.


Да причем здесь "сотни объектов"? Достаточно значительной (много обращений за свойствами) работы с ОДНИМ объектом, как получится эффект, о котором говорил уважаемый al.

Главное, что эта дельта времени есть, а уж как она скажется (или нет) — зависит от программера.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: Дельта времени есть, и это главное.
От: Chorkov Россия  
Дата: 30.04.02 10:44
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Здравствуйте al и CTPEKO3A, Вы писали:


CTP>>Хорошо, но как это влияет на производительность программы?


al>>Выполнение лишнего If занимает некторое время. В некоторых случаях это может быть критично.


Vi2>Главное, что эта дельта времени есть, а уж как она скажется (или нет) — зависит от программера.


А как велика эта дельта времени и откуда она берется?
Перед вызовом любого указателя байсиком проверяется неравенство этого указателя нулю (или это делает инфроструктура COM?). В любом случае сравнение в исходном коде присутствует, но даже пренебригая числом выполнных операций сравнения, время вызова любого
метода класса больше времени затраченного на указанные сравнения.

пример кода:

Module1:
Public Declare Function GetTickCount Lib "kernel32" () As Long
Sub Main()
Dim t1 As Long, t2 As Long, t3 As Long
Dim I As Long
Dim c1 As Class1, c2 As New Class1
Set c1 = New Class1
Dim res As String
res = "Results: "
c1.I = 0
c2.I = 0
c1.D = 0
c2.D = 0
c1.S = "A"
c2.S = "A"
t1 = GetTickCount
For I = 0 To 100000000
    c1.I = c1.I
Next
t2 = GetTickCount
For I = 0 To 100000000
    c2.I = c2.I
Next
t3 = GetTickCount
res = res + vbCrLf + "declare 'As Class1', Integer=" + CStr(t2 - t1)
res = res + vbCrLf + "declare 'As New Class1', Integer=" + CStr(t3 - t2)
t1 = GetTickCount
For I = 0 To 100000000
    c1.D = c1.D
Next
t2 = GetTickCount
For I = 0 To 100000000
    c2.D = c2.D
Next
t3 = GetTickCount
res = res + vbCrLf + "declare 'As Class1', double =" + CStr(t2 - t1)
res = res + vbCrLf + "declare 'As New Class1', double =" + CStr(t3 - t2)
t1 = GetTickCount
For I = 0 To 100000000
    c1.S = c1.S
Next
t2 = GetTickCount
For I = 0 To 100000000
    c2.S = c2.S
Next
t3 = GetTickCount
res = res + vbCrLf + "declare 'As Class1', string =" + CStr(t2 - t1)
res = res + vbCrLf + "declare 'As New Class1', string =" + CStr(t3 - t2)
MsgBox res
Clipboard.SetText res
End Sub

Class1 :
Public I As Integer
Public D As Double
Public S As String


Results:
declare 'As Class1', Integer=15272
declare 'As New Class1', Integer=16544
declare 'As Class1', double =15893
declare 'As New Class1', double =17185
declare 'As Class1', string =95507
declare 'As New Class1', string =98862

Итого раздница на более 8%, а для случая обычно сипользуемых свойств, не более 3%. Вы работаете на задачей где подобное время является критическим? тогда почему ВЫ пишете на VB?
Re[8]: Дельта времени есть, и это главное.
От: Chorkov Россия  
Дата: 30.04.02 11:19
Оценка:
Здравствуйте Chorkov, Вы писали:

Признаю ошибку:
вместо явного цикла:
C>For I = 0 To 100000000
C>    c1.I = c1.I
C>Next

следует использовать повторения интсрукции, иначе учитувается время на оператор next :
For I = 0 To max
    c1.I = c1.I
    c1.I = c1.I
     .... ' 100 раз
    c1.I = c1.I
    c1.I = c1.I
Next

C>Итого раздница на более 8%, а для случая обычно используемых свойств, не более 3%.
получается 17% и 10%, что немного больше .
Re[9]: Дельта времени есть, и это главное.
От: retalik www.airbandits.com/
Дата: 30.04.02 11:37
Оценка:
Здравствуйте Chorkov, Вы писали:

C>получается 17% и 10%, что немного больше .

Не забудьте еще, что у объектов, созданных как As New, невозможно ловить события.
Успехов,
Виталий.
Re[10]: Дельта времени есть, и это главное.
От: al Россия  
Дата: 30.04.02 11:44
Оценка:
Здравствуйте retalik, Вы писали:

R>... у объектов, созданных как As New, невозможно ловить события.


Кроме того, в общем случае, непонятно, в какй момент будет вызван конструктор (Class_Initialize).


Re[10]: Дельта времени есть, и это главное.
От: retalik www.airbandits.com/
Дата: 30.04.02 11:56
Оценка:
Здравствуйте retalik, Вы писали:

R>Не забудьте еще, что у объектов, созданных как As New, невозможно ловить события.

Поправка: почти невозможно (есть какой-то изврат с объектными ссылками)
Кроме того, в VB.NET есть динамическая привязка к событиям (AddHandler).
Успехов,
Виталий.
Re[8]: Дельта времени есть, и это главное.
От: al Россия  
Дата: 30.04.02 12:02
Оценка:
Здравствуйте Chorkov, Вы писали:

C>Здравствуйте Vi2, Вы писали:


Vi2>>Здравствуйте al и CTPEKO3A, Вы писали:


CTP>>>Хорошо, но как это влияет на производительность программы?


C>Перед вызовом любого указателя байсиком проверяется неравенство этого указателя нулю. (или это делает инфроструктура COM?). В любом случае сравнение в исходном коде присутствует,


Это не так. Во пример дезасемблированного кода, порожденного VB:


Исходинк:

Option Explicit

Private Sub Form_Click()
    
    Dim f1 As New Form1
    f1.Show
    
    Dim f2 As Form1
    Set f2 = New Form1
    f2.Show
    
End Sub

Машинный код:

20:   Private Sub Form_Click()
00401924   push        ebp
00401925   mov         ebp,esp
00401927   sub         esp,0Ch
0040192A   push        offset ___vbaExceptHandler (004010c6)
0040192F   mov         eax,fs:[00000000]
00401935   push        eax
00401936   mov         dword ptr fs:[0],esp
0040193D   push        44h
0040193F   pop         eax
00401940   call        VB@TEXT (004010c0)
00401945   push        ebx
00401946   push        esi
00401947   push        edi
00401948   mov         dword ptr [ebp-0Ch],esp
0040194B   mov         dword ptr [ebp-8],offset __imp_@__vbaFreeObj+30h (004010b0)
00401952   mov         eax,dword ptr [Me]
00401955   and         eax,1
00401958   mov         dword ptr [ebp-4],eax
0040195B   mov         eax,dword ptr [Me]
0040195E   and         al,0FEh
00401960   mov         dword ptr [Me],eax
00401963   mov         eax,dword ptr [Me]
00401966   mov         eax,dword ptr [eax]
00401968   push        dword ptr [Me]
0040196B   call        dword ptr [eax+4]
21:
22:       Dim f1 As New Form1
23:       f1.Show
0040196E   cmp         dword ptr [f1],0
00401972   jne         Form1::Form_Click+66h (0040198a)
00401974   lea         eax,[f1]
00401977   push        eax
00401978   push        offset ___vba@00188DC4 (00401358)
0040197D   call        @__vbaNew2 (00401168)
00401982   lea         eax,[f1]
00401985   mov         dword ptr [ebp-50h],eax
00401988   jmp         Form1::Form_Click+6Ch (00401990)
0040198A   lea         eax,[f1]
0040198D   mov         dword ptr [ebp-50h],eax
00401990   mov         eax,dword ptr [ebp-50h]
00401993   mov         eax,dword ptr [eax]
00401995   mov         dword ptr [unnamed_var1],eax
00401998   mov         dword ptr [ebp-34h],80020004h
0040199F   mov         dword ptr [unnamed_var1],0Ah
004019A6   mov         dword ptr [ebp-24h],80020004h
004019AD   mov         dword ptr [unnamed_var1],0Ah
004019B4   push        10h
004019B6   pop         eax
004019B7   call        VB@TEXT (004010c0)
004019BC   lea         esi,[unnamed_var1]
004019BF   mov         edi,esp
004019C1   movs        dword ptr [edi],dword ptr [esi]
004019C2   movs        dword ptr [edi],dword ptr [esi]
004019C3   movs        dword ptr [edi],dword ptr [esi]
004019C4   movs        dword ptr [edi],dword ptr [esi]
004019C5   push        10h
004019C7   pop         eax
004019C8   call        VB@TEXT (004010c0)
004019CD   lea         esi,[unnamed_var1]
004019D0   mov         edi,esp
004019D2   movs        dword ptr [edi],dword ptr [esi]
004019D3   movs        dword ptr [edi],dword ptr [esi]
004019D4   movs        dword ptr [edi],dword ptr [esi]
004019D5   movs        dword ptr [edi],dword ptr [esi]
004019D6   mov         eax,dword ptr [unnamed_var1]
004019D9   mov         eax,dword ptr [eax]
004019DB   push        dword ptr [unnamed_var1]
004019DE   call        dword ptr [eax+2B0h]
004019E4   fnclex
004019E6   mov         dword ptr [unnamed_var1],eax
004019E9   cmp         dword ptr [unnamed_var1],0
004019ED   jge         Form1::Form_Click+0E5h (00401a09)
004019EF   push        2B0h
004019F4   push        offset ___vba@001DA4B0 (00401544)
004019F9   push        dword ptr [unnamed_var1]
004019FC   push        dword ptr [unnamed_var1]
004019FF   call        ___vbaHresultCheckObj (00401162)
00401A04   mov         dword ptr [ebp-54h],eax
00401A07   jmp         Form1::Form_Click+0E9h (00401a0d)
00401A09   and         dword ptr [ebp-54h],0
24:
25:       Dim f2 As Form1
26:       Set f2 = New Form1
00401A0D   push        offset ___vba@00188DC4 (00401358)
00401A12   call        @__vbaNew (00401156)
00401A17   push        eax
00401A18   lea         eax,[f2]
00401A1B   push        eax
00401A1C   call        ___vbaObjSet (0040115c)
27:       f2.Show
00401A21   mov         dword ptr [ebp-34h],80020004h
00401A28   mov         dword ptr [unnamed_var1],0Ah
00401A2F   mov         dword ptr [ebp-24h],80020004h
00401A36   mov         dword ptr [unnamed_var1],0Ah
00401A3D   push        10h
00401A3F   pop         eax
00401A40   call        VB@TEXT (004010c0)
00401A45   lea         esi,[unnamed_var1]
00401A48   mov         edi,esp
00401A4A   movs        dword ptr [edi],dword ptr [esi]
00401A4B   movs        dword ptr [edi],dword ptr [esi]
00401A4C   movs        dword ptr [edi],dword ptr [esi]
00401A4D   movs        dword ptr [edi],dword ptr [esi]
00401A4E   push        10h
00401A50   pop         eax
00401A51   call        VB@TEXT (004010c0)
00401A56   lea         esi,[unnamed_var1]
00401A59   mov         edi,esp
00401A5B   movs        dword ptr [edi],dword ptr [esi]
00401A5C   movs        dword ptr [edi],dword ptr [esi]
00401A5D   movs        dword ptr [edi],dword ptr [esi]
00401A5E   movs        dword ptr [edi],dword ptr [esi]
00401A5F   mov         eax,dword ptr [f2]
00401A62   mov         eax,dword ptr [eax]
00401A64   push        dword ptr [f2]
00401A67   call        dword ptr [eax+2B0h]
00401A6D   fnclex
00401A6F   mov         dword ptr [unnamed_var1],eax
00401A72   cmp         dword ptr [unnamed_var1],0
00401A76   jge         Form1::Form_Click+16Eh (00401a92)
00401A78   push        2B0h
00401A7D   push        offset ___vba@001DA4B0 (00401544)
00401A82   push        dword ptr [f2]
00401A85   push        dword ptr [unnamed_var1]
00401A88   call        ___vbaHresultCheckObj (00401162)
00401A8D   mov         dword ptr [ebp-58h],eax
00401A90   jmp         Form1::Form_Click+172h (00401a96)
00401A92   and         dword ptr [ebp-58h],0
28:
29:   End Sub
00401A96   mov         dword ptr [ebp-4],0
$L29:
00401A9D   push        offset $L53 (00401ab3)
$L28:
00401AA2   lea         ecx,[f1]
00401AA5   call        ___vbaFreeObj (00401150)
00401AAA   lea         ecx,[f2]
00401AAD   call        ___vbaFreeObj (00401150)
$L51:
00401AB2   ret
$L53:
00401AB3   mov         eax,dword ptr [Me]
00401AB6   mov         eax,dword ptr [eax]
00401AB8   push        dword ptr [Me]
00401ABB   call        dword ptr [eax+8]
00401ABE   mov         eax,dword ptr [ebp-4]
00401AC1   mov         ecx,dword ptr [ebp-14h]
00401AC4   mov         dword ptr fs:[0],ecx
00401ACB   pop         edi
00401ACC   pop         esi
00401ACD   pop         ebx
00401ACE   leave
00401ACF   ret         4


Видите, в случае As New — cmp dword ptr [f1],0 и т.д? Это и есть то самое сравнение, которое отсутствует в случае Set ... = New .... Кроме замедления это еще приводит к увеличению размера конечного файла. Проверка-же любого указателя на Nothing проиходит через систему обработки исключений Windows (SEH). Если опустить Set f2 = New Form1, то на операторе mov eax,dword ptr [eax] возникнет исключение "Access Violation" (c0000005). Которое обрабатывается VB Run-time.

Такие вот дела...


Re[11]: Дельта времени есть, и это главное.
От: Chorkov Россия  
Дата: 30.04.02 12:55
Оценка:
Здравствуйте al, Вы писали:

al>Здравствуйте retalik, Вы писали:


R>>... у объектов, созданных как As New, невозможно ловить события.


al>Кроме того, в общем случае, непонятно, в какй момент будет вызван конструктор (Class_Initialize).


Видимо, имеет место непонимание, для чего нужна конструкция As New.
Я использую ее в следующих ситуациях:
1) Сокрытие инициализации переменных (вынесение инициализации за пределы Sub Main).
Например, когда проет разрабатывается большим числом программистов и только оди имеет в данные момент доступ к Main.
2) Создание обьектов "По свитку" (откладывание процедуры инициализации обьектов до момента их фактического использования).
Например в случае когда инициализация переменных требует затрат времени или дополнительного диалога с пользовательм, показ которого нежелателен, если в этих данных так и не возникнет необходимость.

Признаю, что в большенстве из перечисленных ситуаций допустимо использование классов с атрибутом GlobalMultiuse, однако использование New, мне кажется, более оправданным, поскольку позволяет является "более явным". Кроме того, "Глобализация" не позволяет своевременно закрывать обьекты. Например:
в классе:
public rSet as Recordset
private db as Database
Private Sub Class_Initialize()
set db=OpenDatabase(...)
...
End Sub
Private Sub Class_Terminate()
rSet.Close
db.Close
End Sub

На форме:
dim RecSource as New MyClass

База данных будет открываться/закрываться только один раз и только если в ней возникнит необходимость.
Re[9]: Дельта времени есть, и это главное.
От: Chorkov Россия  
Дата: 30.04.02 13:36
Оценка:
Здравствуйте al, Вы писали:

al>Здравствуйте Chorkov, Вы писали:


C>>Здравствуйте Vi2, Вы писали:


Vi2>>>Здравствуйте al и CTPEKO3A, Вы писали:


CTP>>>>Хорошо, но как это влияет на производительность программы?


C>>Перед вызовом любого указателя байсиком проверяется неравенство этого указателя нулю. (или это делает инфроструктура COM?). В любом случае сравнение в исходном коде присутствует,


al>Это не так. Во пример дезасемблированного кода, порожденного VB:


al>

al>Исходинк:

al>Option Explicit

al>Private Sub Form_Click()
al>    
al>    Dim f1 As New Form1
al>    f1.Show
al>    
al>    Dim f2 As Form1
al>    Set f2 = New Form1
al>    f2.Show
al>    
al>End Sub

al>


al>Видите, в случае As New — cmp dword ptr [f1],0 и т.д? Это и есть то самое сравнение, которое отсутствует в случае Set ... = New .... Кроме замедления это еще приводит к увеличению размера конечного файла. Проверка-же любого указателя на Nothing проиходит через систему обработки исключений Windows (SEH). Если опустить Set f2 = New Form1, то на операторе mov eax,dword ptr [eax] возникнет исключение "Access Violation" (c0000005). Которое обрабатывается VB Run-time.


al>Такие вот дела...


Код дейвствительно длиннее ... но на счет скорости вы не вполне правы.
Сравним исполняемую часть кода в случае создания нового обьекта:
С учетом времени затраченного внутри
al> 00401A1C   call        __vbaObjSet (0040115c)
исполняемая часть кода, в слкчае dim as New оказывается короче.

Устверждение об отсутствии предварительной проверки не неравенство нулю, также неверное. Просто вместо прямой проверки (jne) используется косвенная (через проверку доступности указанной памяти на чтение), что требует техже 4 байт интсрукций. Достоинство только в том, что отсутствие явного условного перехода позволяет процессору лучьше предсказывать переходы.
Обращаю, также внимание на то, что наличее обьекта в переменной f2 проверяется только после того как в стек будут загружены все неявные аргументы для вызова метода Show. Что привет к значительным потерям времени в случае использования конструкции:

   dim F as form1
   on error goto err_form1
   F.Show


....


err_form1:
   set F=new form1
   resume


P.S.
В любом случае, раздница в обьеме и скорости кода пренебрежимо мала по сравнению с затратами на процедура Show.
Re[10]: Дельта времени есть, и это главное.
От: al Россия  
Дата: 06.05.02 08:30
Оценка:
Здравствуйте Chorkov, Вы писали:

C>Устверждение об отсутствии предварительной проверки не неравенство нулю, также неверное. Просто вместо прямой проверки (jne) используется косвенная (через проверку доступности указанной памяти на чтение), что требует техже 4 байт интсрукций.


Чего-то я этих 4-х байт как ни искал, так и не нашел. Эту проверку выполняет сам процессор совместно с ОС, и выполняется она в любом случае. Почитайте Рихтера.


 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.