Integer vs String*1 что быстрее сравнивается и присваивается

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Integer vs String*1 что быстрее сравнивается и присваивается

Сообщение Zenitchik » 01.06.2008 (Вс) 12:36

Каюсь, несмотря на хорошие рабочие навыки VB, в вопросах внутренних представлений типов я ламер.

Суть вопроса:
Я довольно часто пишу конечные автоматы для трансляции строк.
У конечного автомата есть сосстояние.
Оно участвует исключительно в конструкции Select Case - на его основании определяется реакция автомата на очередной символ строки, после чего - в зависимости от самого символа - состояние может изменяться или нет.

Обычно я состояния нумерую, используя для хренения текущего состояния переменную типа Integer.
Подумал: нагляднее было бы представлять их символом.
Если я буду юзать для этоих целей тип String*1, я столкнусь с какими-нибудь трудностями в плане быстродействия?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 13:06

Столкнёшься.

Сравнивать два числа намного эффективнее. Только не Integer, а Long.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 01.06.2008 (Вс) 13:20

Если я буду юзать для этоих целей тип String*1, я столкнусь с какими-нибудь трудностями в плане быстродействия?
Когда ты разрабатываешь алгоритм, то стоит все таки уделять внимание на то, что стоит в скобочках после O(*) для твоего алгоритма, а не на мелкие операции. Так что по сути, используй, если тебе удобнее. Потери производительности будут мельчайшие, если конечно твой алгоритм не состоит из одного лишь сравнения.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 13:26

У чела КА, и там каждый цикл используется сравнение.

То, что использовать "a", "b", "c" будет удобнее, чем 1, 2, 3 -- сомнительно, ибо можно объявить константы STATE_A, STATE_B, STATE_C. Что будет и быстрее и читабельнее (понятнее) и грамотнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 01.06.2008 (Вс) 13:41

Спасибо за совет. Воспользуюсь.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 01.06.2008 (Вс) 14:21

Продолжение вопроса.

Работать с одиночными символами все-таки периодически приходится (сравнение, присваивание).
Что предпочтительнее для их хранения: String или String*1? Или сразу в байты преобразовывать? (но ***нусь вспоминвать номера)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 14:44

Пример бы. А то так сложно говорить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 01.06.2008 (Вс) 15:39

Код: Выделить всё
    t = URL & vbNullChar
    Dim t As String, i As Integer, a As String, m As String, q As Integer
    For i = 1 To Len(t)
        a = Mid(t, i, 1)
        If a = "\" Then a = "/"
        Select Case q
            Case 0
                Select Case a
                    Case ":", "/", ".", "?", "&"
                        m = a
                        q = 2
                    Case Else
                        m = a
                        q = 1
                End Select
            Case 1
                Select Case a
                    Case ":", "/", ".", "?", "&"
                        GoSub AnalisURLSyntax
                        m = a
                        q = 2
                    Case vbNullChar
                        GoSub AnalisURLSyntax
                        q = 0
                    Case Else
                        m = m & a
                End Select
            Case 2
                Select Case a
                    Case ":", "/", ".", "?", "&"
                        m = m & a
                        q = 2
                    Case vbNullChar
                        GoSub AnalisURLSyntax
                        q = 0
                    Case Else
                        GoSub AnalisURLSyntax
                        m = a
                        q = 1
                End Select
        End Select
    Next i
    m = vbNullChar
    GoSub AnalisURLSyntax

Вот, например, фрагмент кода. Лексический анализатор, разбивающий URL на "имена" и "разделители" и скармливающий все это поштучно подпрограмме за меткой AnalisURLSyntax: - синтаксическому анализатору (его пока нет, как раз в этот момент пишу).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 15:41

Ээ..?
А почему бы не переложить эту задачу на соотвествущую функцию из wininet.dll? (InternetCrackUrl кажется)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 01.06.2008 (Вс) 15:44

Если бы я еще знал все эти функции.

Но к сабжу это не относится.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 15:51

Чего ж их не знать?
Описание оной есть даже в MSDN98, которая входит в состав студии 98.

В данном случае, подход с mid$-ом -- нехороший подход. Оцени это.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 01.06.2008 (Вс) 16:20

В состав моего дистрибутива она не входит, а искать другой - влом.

Не понял, к чему мне эта статья. Тупо не вижу связи.

UPD
Понял. Но с применением пока разбираюсь.

UPD2:
Въехал.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 01.06.2008 (Вс) 16:59

Еще один вопрос.

Вот, у меня распознаватель состоит из лексического и синтаксического анализаторов.
Лексический (КА) - вычисляет лексемы и скармливает их одну за другой синтаксическому.
Значит, в семантических операциях лексического анализатора после выделения каждой лексемы управление должно передаваться в синтаксический анализатор, и возвращаться "на родину", когда последний эту лексему "усвоит".
В чем проблема: между вызовами, синтаксический анализатор должен хранить свое состояние (если он КА) или стек (если МП-автомат). Плодить переменные уровня модуля я не хочу, статические переменные, ЕМНИП, тормозные, передача ByRef агрументов - не по делу усложнит код.
Сейчас я пользуюсь старым добрым GoSub ))
Вопрос: нельзя ли как-нибудь лучше?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.06.2008 (Вс) 17:23

Статические переменные - не тормозные. В техническом плане они ничем не от отличаются глобальных. Разница только в зоне видимости при написании кода.

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

Так что ерунда это, что они тормознутые. Даже наоборот, это, пожалуй, самый быстрый вид переменных. Для локальных производится отмотка места в стеке и обнуление некоторых переменных. У глобальных БК кончается любым вызовом процедуры, в то время как у статических - только если эта статическая передаётся ByRef.
Последний раз редактировалось Хакер 02.06.2008 (Пн) 8:41, всего редактировалось 2 раз(а).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение alibek » 02.06.2008 (Пн) 8:24

Zenitchik писал(а):Сейчас я пользуюсь старым добрым GoSub ))

Это ты зря. В отличии от GoTo, оператор GoSub не оптимизируется компилятором и является одной из самых тормозных команд.
Lasciate ogni speranza, voi ch'entrate.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 02.06.2008 (Пн) 17:02

Господа, а не искупать ли нам коней в шампанском? у меня еще два вопроса:

1. Что быстрее, (Len(t)>0) или CBool(Len(t))?
2. Что мне читать, чтобы больше подобной ерунды не спрашивать?

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

Сообщение alibek » 02.06.2008 (Пн) 17:08

Я бы советовал Len(t)>0.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.06.2008 (Пн) 17:12

Ну TEST+JG по идее медленнее, чем TEST+JE, потому что JE достаточно найти один ненулевой бит, а JG смотрит ещё и на знаковый бит - он обязательно должен быть сброшен.

Поэтому я бы советовал вариант с CBool. Однако же этот вариант плох с точки зрения читаемости. Поэтому я бы советвал Len(..) <> 0

По сути, то, CBool для Long'a это языковой макрос, раскрывающийся в сравнение с 0.

Что читать? Учить ассемблер, наверное.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 02.06.2008 (Пн) 17:19

Похоже, у нас полярные представления о читаемости )))
Я именно ради ее повышения собрался переходить на CBool )))


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 79

    TopList