Това безопасно ли е?

10 отговора 249 прегледа
#1

Това безопасно ли е?

Здравейте,

прочетох че функциите за обработка на стрингове Left$ , Right$ , Mid$ и т.н. са доста по-бързи от съответно Left , Right , Mid ....

Въпроса ми е: безопасно ли е навсякъде да заменя
Left, Right, Mid, Dir, [R/L]Trim, Str, Lcase, Ucase, Chr, Hex, Oct, String, Format, Space
със съответните им "$" еквиваленти ?

Вече го направих и засега всичко изглежда ОК, някой сеща ли се за някакъв специфичен случай в който подобна замяна да предизвика проблем?

10х

Отговор
в отговор на Пeшo #2

Re: Това безопасно ли е?

По някаква причина МС не харесва вече $ функциите, но въпреки това те все още съществуват и работят без проблем.... Единствения проблем който можеш да срещнеш е при употребата на Null стойности. Ако използваш $ функциите, ще получиш грешка ако дадеш Null стойност като параметър.

Епа, това е моето хоби... [линк]
Отговор
в отговор на fiffy #3

Re: Това безопасно ли е?

Добре де. А вярно ли е, че Left$(a) работи по-бързо от Left(a) ???


Щирлиц
Отговор
в отговор на Щиpлиц #4

Re: Това безопасно ли е?

Вярно е, защото Left работи с Variant променливи, докъто Left$ със стрингове, което спестява overhead-а от преобразуването на променливите и определянето на типа им преди и след операцията.

Епа, това е моето хоби... [линк]
Отговор
в отговор на fiffy #5

Re: Това безопасно ли е?

Разликата е минимална - може да си пуснеш цикъл до 100000 с 2та варианта, ако не ми вярваш.

Ако наистина искаш да си спестиш време - разкарай неща от кода като :
strBuf = strBuf & ...
особено в цикъл.


[линк]

Отговор
в отговор на Щиpлиц #6

Re: Това безопасно ли е?

Абе на практика се оказа дори обратното.
В доста голям проект който 85% обработва стрингове, подмених всички тия функции със $ еквивалентите им. При еднакви настройки и условия, старото ехе (без $) обработва файл с 5-10% по-бързо от новото (със $ - нищо друго не съм пипал). Това е усреднен резултат от около 50 опита.
Не знам как да си го обясня, на теория би следвало да е обратното.



Отговор
в отговор на Пeшo #7

Re: Това безопасно ли е?

Напиши в началото на всеки фаил :
Option Explicit

Разкарай думата Variant от кода.

И пробвай пак.

Отговор
в отговор на VBProgrammer #8

Re: Това безопасно ли е?

Рядко използвам Option Explicit, но на практика във всички по-важни и често използвани процедури/ф-ии всички променливи са декларирани като някакъв тип (без Variant), така че разлика почти няма.
Тук-там има недекларирани, в код който се занимава с ГУИ-то и няма отношение към бързодействието.

Както казах, при абсолютно всичко друго еднакво, ехе което не използва $ ф-ии работи по-бързо от такова което ги използва. Странно, но факт. Не виждам как декларирането на абсолютно всичко (което сега си е 90% така) може да промени нещо.

Отговор
в отговор на Пeшo #9

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>

Отговор
в отговор на wqw #10

Re: Това безопасно ли е?

Благодаря колега, точно двойното конвертиране ми беше идеята.
Има още скрити конверсии които ядат време и памет.
Например не е добре да се декларират променливи от тип Object. Когато се вика мембър на обекта всичко се прави на нещо като варианти. Има 1000 статии по темата IDispatch::Invoke & Early vs Late binding.

[линк]

Просто съм на същата вълна - мин седмица ми тръснаха един репорт с 2000 реда код за генериране датасета за една единствена страница. "Ми ние толкова красиво го написахме. Само дето на бързия сървер върви за 4.5 часа, а усерите искали да печатат по 10-20/час. Сигурно е нещо малко. Я я, го виж там."

Отговор
в отговор на VBProgrammer #11

Re: Това безопасно ли е?

Има минимална разлика

'-----------------------------------

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% разлика. Но при малък брой цикли разликата е нищожна и дори не винаги в полза на $

Отговор