Това безопасно ли е?
10 отговора
249 прегледа
Това безопасно ли е?
Здравейте,
прочетох че функциите за обработка на стрингове Left$ , Right$ , Mid$ и т.н. са доста по-бързи от съответно Left , Right , Mid ....
Въпроса ми е: безопасно ли е навсякъде да заменя
Left, Right, Mid, Dir, [R/L]Trim, Str, Lcase, Ucase, Chr, Hex, Oct, String, Format, Space
със съответните им "$" еквиваленти ?
Вече го направих и засега всичко изглежда ОК, някой сеща ли се за някакъв специфичен случай в който подобна замяна да предизвика проблем?
10х
прочетох че функциите за обработка на стрингове Left$ , Right$ , Mid$ и т.н. са доста по-бързи от съответно Left , Right , Mid ....
Въпроса ми е: безопасно ли е навсякъде да заменя
Left, Right, Mid, Dir, [R/L]Trim, Str, Lcase, Ucase, Chr, Hex, Oct, String, Format, Space
със съответните им "$" еквиваленти ?
Вече го направих и засега всичко изглежда ОК, някой сеща ли се за някакъв специфичен случай в който подобна замяна да предизвика проблем?
10х
Re: Това безопасно ли е?
По някаква причина МС не харесва вече $ функциите, но въпреки това те все още съществуват и работят без проблем.... Единствения проблем който можеш да срещнеш е при употребата на Null стойности. Ако използваш $ функциите, ще получиш грешка ако дадеш Null стойност като параметър.
Епа, това е моето хоби... [линк]
Епа, това е моето хоби... [линк]
Re: Това безопасно ли е?
Добре де. А вярно ли е, че Left$(a) работи по-бързо от Left(a) ???
Щирлиц
Щирлиц
Re: Това безопасно ли е?
Вярно е, защото Left работи с Variant променливи, докъто Left$ със стрингове, което спестява overhead-а от преобразуването на променливите и определянето на типа им преди и след операцията.
Епа, това е моето хоби... [линк]
Епа, това е моето хоби... [линк]
Re: Това безопасно ли е?
Разликата е минимална - може да си пуснеш цикъл до 100000 с 2та варианта, ако не ми вярваш.
Ако наистина искаш да си спестиш време - разкарай неща от кода като :
strBuf = strBuf & ...
особено в цикъл.
[линк]
Ако наистина искаш да си спестиш време - разкарай неща от кода като :
strBuf = strBuf & ...
особено в цикъл.
[линк]
Re: Това безопасно ли е?
Абе на практика се оказа дори обратното.
В доста голям проект който 85% обработва стрингове, подмених всички тия функции със $ еквивалентите им. При еднакви настройки и условия, старото ехе (без $) обработва файл с 5-10% по-бързо от новото (със $ - нищо друго не съм пипал). Това е усреднен резултат от около 50 опита.
Не знам как да си го обясня, на теория би следвало да е обратното.

В доста голям проект който 85% обработва стрингове, подмених всички тия функции със $ еквивалентите им. При еднакви настройки и условия, старото ехе (без $) обработва файл с 5-10% по-бързо от новото (със $ - нищо друго не съм пипал). Това е усреднен резултат от около 50 опита.
Не знам как да си го обясня, на теория би следвало да е обратното.
Re: Това безопасно ли е?
Напиши в началото на всеки фаил :
Option Explicit
Разкарай думата Variant от кода.
И пробвай пак.
Option Explicit
Разкарай думата Variant от кода.
И пробвай пак.
Re: Това безопасно ли е?
Рядко използвам Option Explicit, но на практика във всички по-важни и често използвани процедури/ф-ии всички променливи са декларирани като някакъв тип (без Variant), така че разлика почти няма.
Тук-там има недекларирани, в код който се занимава с ГУИ-то и няма отношение към бързодействието.
Както казах, при абсолютно всичко друго еднакво, ехе което не използва $ ф-ии работи по-бързо от такова което ги използва. Странно, но факт. Не виждам как декларирането на абсолютно всичко (което сега си е 90% така) може да промени нещо.
Тук-там има недекларирани, в код който се занимава с ГУИ-то и няма отношение към бързодействието.
Както казах, при абсолютно всичко друго еднакво, ехе което не използва $ ф-ии работи по-бързо от такова което ги използва. Странно, но факт. Не виждам как декларирането на абсолютно всичко (което сега си е 90% така) може да промени нещо.
Re: Това безопасно ли е?
Опитай се да разбириш защо новият код работи по бавно използвайки hint-а на VBProgrammer:
Dim vText As Variant
vText = Left$(vText, 1)
vs.
Dim sText As String
sText = Left$(sText, 1)
Първото е по-бавно от
Dim vText As Variant
vText = Left(vText, 1)
... понеже не се конвертира Variant->String на параметъра и String->Variant на върната стойност.
cheers,
</wqw>
Dim vText As Variant
vText = Left$(vText, 1)
vs.
Dim sText As String
sText = Left$(sText, 1)
Първото е по-бавно от
Dim vText As Variant
vText = Left(vText, 1)
... понеже не се конвертира Variant->String на параметъра и String->Variant на върната стойност.
cheers,
</wqw>
Re: Това безопасно ли е?
Благодаря колега, точно двойното конвертиране ми беше идеята.
Има още скрити конверсии които ядат време и памет.
Например не е добре да се декларират променливи от тип Object. Когато се вика мембър на обекта всичко се прави на нещо като варианти. Има 1000 статии по темата IDispatch::Invoke & Early vs Late binding.
[линк]
Просто съм на същата вълна - мин седмица ми тръснаха един репорт с 2000 реда код за генериране датасета за една единствена страница. "Ми ние толкова красиво го написахме. Само дето на бързия сървер върви за 4.5 часа, а усерите искали да печатат по 10-20/час. Сигурно е нещо малко. Я я, го виж там."
Има още скрити конверсии които ядат време и памет.
Например не е добре да се декларират променливи от тип Object. Когато се вика мембър на обекта всичко се прави на нещо като варианти. Има 1000 статии по темата IDispatch::Invoke & Early vs Late binding.
[линк]
Просто съм на същата вълна - мин седмица ми тръснаха един репорт с 2000 реда код за генериране датасета за една единствена страница. "Ми ние толкова красиво го написахме. Само дето на бързия сървер върви за 4.5 часа, а усерите искали да печатат по 10-20/час. Сигурно е нещо малко. Я я, го виж там."
Re: Това безопасно ли е?
Има минимална разлика
'-----------------------------------
'-----------------------------------
при 10 милиона цикъла компилирано ехе дава 25.7 сек. за $ срещу 28.8 , т.е около 10% разлика. Но при малък брой цикли разликата е нищожна и дори не винаги в полза на $
'-----------------------------------
Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Sub cmdTest1_Click()
Dim s1$, s2$, s3$, s4$, s5$, i&, t1&, t2&
s1 = " ABCDEFGHijklmnopqrst"
t1 = timeGetTime()
For i = 1 To 10000000
s2 = Left(s1, 5)
s3 = Mid(s1, 3, 7)
s4 = Trim(s1)
s5 = Replace(s1, "GHij", "XYZ")
Next
t2 = timeGetTime()
lblLabel1.Caption = "test 1 [regular functions] took " & CStr((t2 - t1) / 1000) & " seconds."
End Sub
Private Sub cmdTest2_Click()
Dim s1$, s2$, s3$, s4$, s5$, i&, t1&, t2&
s1 = " ABCDEFGHijklmnopqrst"
t1 = timeGetTime()
For i = 1 To 10000000
s2 = Left$(s1, 5)
s3 = Mid$(s1, 3, 7)
s4 = Trim$(s1)
s5 = Replace$(s1, "GHij", "XYZ")
Next
t2 = timeGetTime()
lblLabel2.Caption = "test 2 [$ functions] took " & CStr((t2 - t1) / 1000) & " seconds."
End Sub
'-----------------------------------
при 10 милиона цикъла компилирано ехе дава 25.7 сек. за $ срещу 28.8 , т.е около 10% разлика. Но при малък брой цикли разликата е нищожна и дори не винаги в полза на $