Скорость строковых функций

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Скорость строковых функций

Сообщение Space » 03.09.2008 (Ср) 23:39

Правда ли, что строковые ф-и вроде Mid$ работают быстрее их аналога без $, т.к Mid возвращает Variant, а Mid$ возвращает String? Я ранее думал, что Mid это тоже что и Mid$, только $ опущен для простоты набора команды. Зачем Mid возвращать Variant - в каких случаях это необходимо и даже возможно? Ведь Mid всегда работает со строкой и возвращает её, и другой тип вернуть не может.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Скорость строковых функций

Сообщение Viper » 04.09.2008 (Чт) 7:31

Space писал(а):Правда ли, что строковые ф-и вроде Mid$ работают быстрее их аналога без $, т.к Mid возвращает Variant, а Mid$ возвращает String?.
Правда. Так оно и есть. Помимо Mid$ и Mid и остальные функции работы со строками имеюют две версии.
Space писал(а):Зачем Mid возвращать Variant - в каких случаях это необходимо и даже возможно?
В случае, если приходиться работать с Variant.
Space писал(а):Ведь Mid всегда работает со строкой и возвращает её, и другой тип вернуть не может.
Mid может (собственно и возвращает) вернуть Variant, содержащий внутри String. Также может использоваться аргумент типа Variant.
Весь мир матрица, а мы в нем потоки байтов!

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Скорость строковых функций

Сообщение Space » 04.09.2008 (Чт) 14:31

а смысл какой? Ведь переменная Variant может принять String:
Код: Выделить всё
Dim v1 as Variant
v1=mid$(a$,10)

другое дело Variant в качестве параметра функции...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Скорость строковых функций

Сообщение Viper » 04.09.2008 (Чт) 14:51

Space писал(а):а смысл какой? Ведь переменная Variant может принять String
Может, но на преобразование уйдет некоторое время. Одним словом, при работе со строками надо пользоваться $-версиями строковых функций.
З.Ы. Можешь, кстати, протестировать время работы. Тестовую програмку несложно набросать.
Весь мир матрица, а мы в нем потоки байтов!

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Скорость строковых функций

Сообщение Space » 04.09.2008 (Чт) 15:16

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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Скорость строковых функций

Сообщение Viper » 04.09.2008 (Чт) 15:20

Space писал(а):да, несложно. Я думаю, что разница во времени выполнения будет мала.
В разы будет разница между Mid и Mid$ для строк. ЕМНИП раза в три где то.
Весь мир матрица, а мы в нем потоки байтов!

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Скорость строковых функций

Сообщение Денис » 05.09.2008 (Пт) 10:37

Viper писал(а):ЕМНИП раза в три где то.

Внезапно бенчмарк!
Код: Выделить всё
Private Sub Form_Load()

Debug.Print "Test MID"
Debug.Print "________"

Dim T1 As Single
Dim A1 As String
Dim i As Long
Const Sample As String = "svfkbvgsdbfhvbshdfhbv"
Const Iter As Long = 1000000

T1 = Timer
For i = 1 To Iter
   A1 = Mid(Sample, 5, 2)
Next
T1 = Timer - T1
Debug.Print "Время Mid : " & T1

T1 = Timer
For i = 1 To Iter
   A1 = Mid$(Sample, 5, 2)
Next
T1 = Timer - T1
Debug.Print "Время Mid$: " & T1

End Sub


Код: Выделить всё
Test MID
________
Время Mid : 0,42125
Время Mid$: 0,155375
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: Скорость строковых функций

Сообщение Space » 05.09.2008 (Пт) 12:20

интересно, что у тебя коеффициент = 0,42125/0,155375=2,7
у меня коеффициент для дизайнера колеблется в пределах [1.38;1.58], для exe [1.11;1.375]. Наверно, это связано с алгоритмами предугадывания выполнения команд процессором. У меня AMD 3200, а у тебя скорее проц от Intel ;) Также со способом компиляции, у меня Compile to Native Code - Optimize for Fast Code.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Скорость строковых функций

Сообщение alibek » 05.09.2008 (Пт) 12:50

Space писал(а):Наверно, это связано с алгоритмами предугадывания выполнения команд процессором.

Нет.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Скорость строковых функций

Сообщение Денис » 05.09.2008 (Пт) 14:10

Space писал(а):У меня AMD 3200, а у тебя скорее проц от Intel ;)

Ха, зато у тебя страницы форума не сохраняются! А у меня - да.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Скорость строковых функций

Сообщение Viper » 05.09.2008 (Пт) 15:09

У меня тест посложнее и подлиннее, результат:
При использовании Mid$ время = 17.54 секунд.
При использовании Mid строк = 53.44 секунд.
Аккурат в три раза быстрее.
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList