Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/55: Рейтинг темы: голосов - 55, средняя оценка - 5.00
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Обсуждение способов ускорения работы программ на VB6

08.01.2015, 17:13. Показов 10856. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В этой теме обсуждаем способы ускорения работы программ на VB6 по мотивам статьи
[Статья] Как заставить Вашу программу на VB работать быстрее?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2015, 17:13
Ответы с готовыми решениями:

Обсуждение и сравнение способов и инструментов для работы с текстовыми файлами в ОС windows
Garry Galler, никогда не поздно узнать, что .NET среда еще быстрее, чем cmd и PowerShell. (тут я даю код в три строки с скомпилированным...

Обсуждение своих программ
Ув.Программисты, решил открыть темку,где можно продемонстрировать свою прогу,обсуждать ее коды:):)Буду рад ваших ответов:):) Добавлено...

Обсуждение полезных материалов/ресурсов/программ/библиотек по Qt
В данной теме ведётся обсуждение полезных материалов, ресурсов, программ и библиотек по Qt. Наиболее полезные будут включаться в список в...

52
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.01.2015, 22:22
Очень много неточностей и недочетов, пока нет времени описать.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
08.01.2015, 22:27  [ТС]
Что же. Опишешь, как будет время. С нетерпением будем ждать.
У соседней статьи тоже сделаны интересные выводы. Некоторые противоречят с этой.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.01.2015, 22:35
Dragokas, я занимаюсь написанием практически полноценной поддержки DirectX9 (а в последствии и 10, 11) в VB6, на это уйдет некоторое время. Как сделаю, тогда отпишу. Вторую статью не читал пока.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
09.01.2015, 08:38
Цитата Сообщение от Pro_grammer Посмотреть сообщение
У меня свой тест: VB6 VS PureBasic 5.31 ( думаю, что FreeBasic не хуже)
Бессмысленный тест, который еще и неправильный. Какой тип у Random? А какой у Rnd? Тест на помойку.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
С оговоркой на более современные Бейсики.
Это заблуждение. Если речь идет от 64-разрядном коде (который VB6 не умеет делать), то да, прирост производительности будет на x64, но не такой ошеломляющий как многие думают. В других случаях производительность будет примерно одинаковая, где-то на VB6 быстрее, где-то в других ЯП. Вообще производительность зависит от компилятора.
Какой бейсик быстрее
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.01.2015, 09:02
Цитата Сообщение от The trick Посмотреть сообщение
Какой тип у Random? А какой у Rnd? Тест на помойку.
Не смешите меня, Мэтр! Такой код напишет 99.9% юзеров ( оствляю 0.1% на гениев, которые может изменят тип RND?), и какой там тип - это проблемы VB6 и PB, юзер пользует то, что ему предоставили в пользование. Если результат должен присваиваться переменной типа Byte, то и RND пусть генерирует Byte, а иначе компилятор отстой, о чем мы и говорим:
Цитата Сообщение от The trick Посмотреть сообщение
Вообще производительность зависит от компилятора.
Тест может и помойный, не я его писал, там сравнивали производительность VB6/VC6/Delphi6/Java. VB6 даже чуть хуже интерпретатора Java и это обидно.
А в моем тесте Vb6 хуже BP в 6 раз! И это реально так, и про типы Random и Rnd всего лишь отмазки.
Код то в обоих случаях одинаковый, т.е оба компилятора в равных условиях, а уж как они справляются это их дело.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,705
Записей в блоге: 14
09.01.2015, 17:53
В свое время я очень заинтересовался PowerBasic. Причины были веские:

1) преемственность по отношению к TurboBasic, который я очень любил (люблю); Тот же автор компилятора P. Зейл.
2) компактный нативный код, не требующий dll-поддержки.

Решил сравнить производительности 32-х битного кода. Каково же было мое удивление, когда оказалось, что на простейшем тесте VB6 заметно быстрее PowerBasic...
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
09.01.2015, 21:39
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не смешите меня, Мэтр! Такой код напишет 99.9% юзеров ( оствляю 0.1% на гениев, которые может изменят тип RND?), и какой там тип - это проблемы VB6 и PB, юзер пользует то, что ему предоставили в пользование. Если результат должен присваиваться переменной типа Byte, то и RND пусть генерирует Byte, а иначе компилятор отстой,
А что в PB генерируется Byte? В PB - Random генерирует случайные целые числа. Так что RND и RANDOM(1,0) - это не одно и тоже. Ты бы еще строки или варианты поставил и говорил - "вот VB - медленный, PB - очень быстрый". Если мне нужно будет заполнить массив Single значениями от 0 до 1, я могу смело написать s(i) = Rnd, если я напишу в PB s(i) = Random(1,0), то результат будет другой - не тот который нужен. И если ты говоришь - что типы - проблемы ЯП, то я не буду тебе доказывать что VB по скорости не хуже PB, т.к. не вижу в этом смысла.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Тест может и помойный, не я его писал, там сравнивали производительность VB6/VC6/Delphi6/Java. VB6 даже чуть хуже интерпретатора Java и это обидно. А в моем тесте Vb6 хуже BP в 6 раз!
Этот тест - мусор, порождение криворукого "программиста", который ничего не тестирует и ничего не показывает, а кто верит таким тестам - далеко от этого "программиста" не ушел.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И это реально так, и про типы Random и Rnd всего лишь отмазки.
Отмазки - это
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Такой код напишет 99.9% юзеров ( оствляю 0.1% на гениев, которые может изменят тип RND?), и какой там тип - это проблемы VB6 и PB, юзер пользует то, что ему предоставили в пользование.
, типизация есть очень во многих ЯП.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Код то в обоих случаях одинаковый, т.е оба компилятора в равных условиях, а уж как они справляются это их дело.
Код разный, компиляторы не в равных условия, тестируются совершенно разные функции. Еще раз повторю, подставь строки или варианты в VB6 и скажи что код еще хуже стал работать. Можешь завести строковую переменную со всеми десятичными цифрами и переставлять каждый символ в позицию задаваемую какой-нибудь функцией - это даст вполне случайное число в строковом представлении, а потом с помощью Val переводи в Long и сравни производительность. Тест, то одинаковый и там и там генерируются случайные числа.
Цитата Сообщение от Catstail Посмотреть сообщение
Решил сравнить производительности 32-х битного кода. Каково же было мое удивление, когда оказалось, что на простейшем тесте VB6 заметно быстрее PowerBasic...
VB6 генерирует очень компактный и довольно шустрый код с использованием математики, простых конструкций типа For Next, Do While, Select Case и т.д. Я неоднократно выкладывал ассемблерные листинги здесь в которых можно увидеть работу компилятора VB6. Все кто говорит обратное - невежды. Я например это знаю не по одному листингу, а довольно-таки часто исследую скомпилированный код и могу сказать что VB6 генерирует код не хуже других компиляторов (не говорю за студии позже 2008, т.к. там есть векторные оптимизации с использование SIMD расширений). Я не говорю к примеру что PB - отстой или VB - лучший, т.к. это некорректно в любой задаче какой-то ЯП будет быстрее, какой-то медленней, но в целом они одинаковые.
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.01.2015, 22:50
Цитата Сообщение от The trick Посмотреть сообщение
В PB - Random генерирует случайные целые числа.
Да, но как он это делает? В любом случае алгоритм основан на операциях в результате которых появляются дроби. Ты же не дилетант. Как можно генерировать псевдо случайные целые числа, не оперируя дробными?
Random и Rnd это встроенные функции, результат работы которых разный, но алгоритм поиска случайных чисел связан c дробями так или иначе. А если PB этот результат ещё и округляет до целого, что тоже требует процессорного времени, и в результате всё равно быстрее, то это только доказывает эффективность его быстрых алгоритмов, по сравнению с VB6.

Алгоритм генерации RND VB описан в MDSN
x1 = ( x0 * a + c ) MOD (2^24)

где:

x 1 = новое значение
x 0 = предыдущее значение (начальное значение 327680 используется в Visual Basic)
= 1140671485
c = 12820163

В приведенных выше формулах оператор «MOD» возвращает целочисленный остаток после целочисленного деления.
Алгоритм не может быть реализован в коде Visual Basic потому, что используется тип unsigned long, который не поддерживается языком Visual Basic. Видимо алгоритм написан на Си.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
09.01.2015, 23:00
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Да, но как он это делает? В любом случае алгоритм основан на операциях в результате которых появляются дроби.
Нет. Это линейно-конгруэнтный метод, там вообще не используются дроби.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ты же не дилетант. Как можно генерировать псевдо случайные целые числа, не оперируя дробными?
Вот формула для VB6, то что написано в MSDN - бред и не соответствует действительности:
NewVal = (0xFFC39EC3 - (OldVal * 0x2BC03)) And &HFFFFFF
Вот тебе пример, если не веришь мне на слово:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Option Explicit
 
Private Type INT64
    l As Long
    h As Long
End Type
Private Type CUR
    v As Currency
End Type
Private Type DBL
    d As Double
End Type
 
Dim oldVal As INT64
 
Private Sub Form_Load()
    Dim Seed As Long, i As Long
 
    InitMyRnd
 
    Debug.Print "Pass 1:"
    For i = 0 To 10
        Debug.Print Rnd
        Debug.Print MyRnd
    Next
 
    Randomize 500
    MyRandomize 500
 
    Debug.Print "Pass 2:"
    For i = 0 To 10
        Debug.Print Rnd
        Debug.Print MyRnd
    Next
 
End Sub
 
Private Function MyRnd() As Single
    Dim c As CUR
    c.v = 429101.0243@ - (CCur(oldVal.l / 10000) * 179203@)
    LSet oldVal = c: oldVal.l = (oldVal.l And &HFFFFFF)
    MyRnd = oldVal.l / &H1000000
End Function
 
Private Sub MyRandomize(ByVal Seed As Long)
    Dim r As DBL, l As INT64
    r.d = CDbl(Seed)
    LSet l = r
    oldVal.l = ((l.h \ &H100) And &HFFFF00) Xor ((l.h And &HFFFF&) * &H100) Or (oldVal.l And &HFF0000FF)
End Sub
Private Sub InitMyRnd()
    oldVal.l = 327680
End Sub
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Random и Rnd это встроенные функции, результат работы которых разный, но алгоритм поиска случайных чисел связан c дробями так или иначе.
Нет. В RND дробь используется только в качестве делителя (величина перед возвратом делится на 16777216), в PB не знаю как, скорее всего просто находится остаток.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А если PB этот результат ещё и округляет до целого, что тоже требует процессорного времени, и в результате всё равно быстрее, то это только доказывает эффективность его быстрых алгоритмов, по сравнению с VB6.
Это доказывает твое незнание алгоритма и ты еще утверждаешь что он эффективней VB6.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Алгоритм не может быть реализован в коде Visual Basic потому, что используется тип unsigned long, который не поддерживается языком Visual Basic. Видимо алгоритм написан на Си.
Алгоритм приведен выше на VB6.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.01.2015, 00:22
Цитата Сообщение от The trick Посмотреть сообщение
то что написано в MSDN - бред и не соответствует действительности:

Цитата Сообщение от The trick Посмотреть сообщение
Алгоритм приведен выше на VB6.


Код MyRND на VB6 работает в 3 раза медленнее, чем родной RND.
И ты конечно и дальше можешь доказывать, что ты более в курсе, чем парни из Микрософт, сочиняющие бредовые MDSN, но лучше сделай так что бы этот "помойный" код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Command1_Click()
Dim Start As Long
Start = GetTickCount()
Dim arr1(10000) As Byte
Dim i As Integer
Dim j As Integer
For i = 1 To 10000
    For j = 1 To 10000
        arr1(j) = Rnd() Mod 100
    Next j
Next i
Dim EndTime As Long
EndTime = GetTickCount()
MsgBox "That took " & Str(EndTime - Start) & " milliseconds to complete."
End Sub
отработал за время менее 1 сек, это приблизит VB6 по скорости к другим, более быстрым языкам программирования, типа PureBasic, Делфи и С++. Всё остальное просто расцениваю, как нежелание признать очевидный факт, что функция RND в VB6 работает очень медленно и её надо по возможности избегать.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.01.2015, 02:53
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Код MyRND на VB6 работает в 3 раза медленнее, чем родной RND.
Это приведен алгоритм который показывает формулу, а не скорость работы, и который приведен в пример тебе на твое высказывание:
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Да, но как он это делает? В любом случае алгоритм основан на операциях в результате которых появляются дроби. Ты же не дилетант. Как можно генерировать псевдо случайные целые числа, не оперируя дробными?
Пример никак не оптимизирован.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Код MyRND на VB6 работает в 3 раза медленнее, чем родной RND.
При компиляции в нативный код со всеми оптимизациями MyRnd - такой же по скорости как и RND, но некорректно его засовывать в модуль формы и тестировать, т.к. это медленней из-за того что MyRnd превращается в метод.
Вот версия для скомпилированного варианта с оптимизацией по скорости:
Visual Basic
1
2
3
4
Public Function MyRnd() As Single
    oldVal = (&HFFC39EC3 - (oldVal * &H2BC03)) And &HFFFFFF
    MyRnd = oldVal / &H1000000
End Function
Результат:
That took 3682 milliseconds to complete.
Ок.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И ты конечно и дальше можешь доказывать, что ты более в курсе, чем парни из Микрософт, сочиняющие бредовые MDSN, но лучше сделай так что бы этот "помойный" код отработал за время менее 1 сек, это приблизит VB6 по скорости к другим, более быстрым языкам программирования, типа PureBasic, Делфи и С++.
OMG! Я даже не хочу ничего на это отвечать, видимо дилетант все-таки - ты. Что такое "быстрый язык программирования"? Быстрым может быть код, но не как не ЯП. Я написал все правильно, если не веришь посмотри свою формулу которую ты привел и которая есть в MSDN и проверь значения возвращаемые ей и функцией Rnd.
Да в легкую. Делаем все по честному. Типы i - аналоги Long, а не Integer. Rnd меняем на наш - только целочисленный:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim oldVal  As Long
 
Public Function MyRnd() As Long
    oldVal = (&HFFC39EC3 - oldVal * &H2BC03) And &HFFFFFF
    MyRnd = (oldVal \ &H100000) And 1
End Function
 
Public Sub InitMyRnd()
    oldVal = 327680
End Sub
MyRnd - возвращает либо 0, либо 1, как у тебя в примере тип l, для VB6 - это Long. Компилируем. Смотрим:

учитывая то, что мой комп считает с обычным Rnd около 9 секунд.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Всё остальное просто расцениваю, как нежелание признать очевидный факт, что функция RND в VB6 работает очень медленно и её надо по возможности избегать.
Такая же функция в другом ЯП будет работать почти также, а сейчас ты сравниваешь холодное с красным. Также эта функция многофункциональна, она может генерировать одну и туже последовательность, также в качестве зерна можно задать все что угодно. Может ли это Random? Чуть выше я кидал ссылку на пост с ассемблерными листингами PB и VB, там прекрасно видно как работает компилятор - это реальный пример, который сравнивает действительно работу компилятора, и который утверждает обратное нежели ты тут хочешь показать.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.01.2015, 07:56
Цитата Сообщение от The trick Посмотреть сообщение
она может генерировать одну и туже последовательность, также в качестве зерна можно задать все что угодно. Может ли это Random?
Да, может. Так же предварительно задается ядро RandomSeed(Value).
Цитата Сообщение от The trick Посмотреть сообщение
учитывая то, что мой комп считает с обычным Rnd около 9 секунд.
Т.е. ты сам признаешь, что родная Rnd() более чем в 4 раза медленнее, чем самописная?
Цитата Сообщение от The trick Посмотреть сообщение
видимо дилетант все-таки - ты.
Я безусловно, не так крут как ты, и не боюсь этого признать. Я в числе тех 99.9 % программеров, которые используют RND, в том числе для генерации случайных целых чисел.
Ну в любом случае, эта тема о том, как сделать программы на VB6 чуточку быстрее. И твоё упорство в доказательстве того, что RND
Цитата Сообщение от The trick Посмотреть сообщение
Такая же функция в другом ЯП будет работать почти также
меня просто удивляет.
Для чего вводить людей в заблуждение?

Не смог запустить твой код с MyRND.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
Dim oldVal  As Long
 
Public Function MyRnd() As Long
    oldVal = (&HFFC39EC3 - oldVal * &H2BC03) And &HFFFFFF
    MyRnd = (oldVal \ &H100000) And 1
End Function
 
Public Sub InitMyRnd()
    oldVal = 327680
End Sub
Private Sub Form_Load()
InitMyRnd
Dim i As Long
Dim n As Long
 
For i = 1 To 10000
n = n + MyRnd
Next
Debug.Print n
 
End Sub
В строке
Visual Basic
1
oldVal = (&HFFC39EC3 - oldVal * &H2BC03) And &HFFFFFF
вылетает с ошибкой "Overflow"
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.01.2015, 11:22
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Да, может. Так же предварительно задается ядро RandomSeed(Value).
Это может другая функция а не Random. Random принимает только два целочисленных параметра с Min и Max. С Rnd я могу написать так Rnd(0), или так Rnd(-1), или так Rnd(Me) и это задаст разные режимы работы. Может ли так Random?
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Т.е. ты сам признаешь, что родная Rnd() более чем в 4 раза медленнее, чем самописная?
Родная Rnd и та что я описал - не одно и тоже, разве ты не видишь что там нет такого же параметра? Разве там реализован функционал Rnd?
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Я в числе тех 99.9 % программеров, которые используют RND, в том числе для генерации случайных целых чисел.
Ок. Давай сделаем так, поменять тип массива на Single и там и там, убери Mod. По твоей логике тест не поменяется, а результат? Я удивляюсь что ты пытаешься мне что-то доказать сравнивая совершенно разные функции с разными типами и выдать здесь за истину. 99.9% юзеров используют Rnd для генерации вещественных чисел. Я тебе уже привел пример со строкой. Другой пример - 99.9% юзеров могут написать так, для того чтобы подписаться на события COM объекта в другом процессе:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Option Explicit
 
Dim WithEvents z As Word.Application
 
Private Sub Form_Load()
    Set z = CreateObject("Word.Application")
    z.Visible = True
End Sub
 
Private Sub z_WindowActivate(ByVal Doc As Word.Document, ByVal Wn As Word.Window)
    MsgBox "Activate"
End Sub
Интересно посмотреть как это будет выглядеть в PB или еще где-нибудь. И как быстро по времени это будет работать?
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Для чего вводить людей в заблуждение?
Я никого не ввожу в заблуждение. Если ты не знаешь как работает Rnd, а потом начинаешь что-то за нее говорить - то это ты вводишь людей в заблуждение.
  • Rnd - потокозависима и создав 10 потоков, каждая функция будет генерировать последовательность сначала в каждом потоке. Может ли это Random?
  • Rnd - позволяет повторять последовательность, или вообще генерировать случайное число на основании переданного значения, причем если его передать еще раз то оно будет тоже самое - это например позволяет генерировать шум Перлина и т.д. Может ли это Random?
  • Rnd - генерирует случайное вещественное число, может ли это Random? Так что Rnd() и Random(1,0) - это не одно и тоже как ты их сравниваешь.
  • Rnd - в качестве параметра принимает значение Variant, что позволяет передать в качестве зерна все что угодно. Может ли это Random?
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не смог запустить твой код с MyRND.
Читай внимательней:
Цитата Сообщение от The trick Посмотреть сообщение
Вот версия для скомпилированного варианта с оптимизацией по скорости:
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.01.2015, 12:27
Цитата Сообщение от The trick Посмотреть сообщение
Давай сделаем так, поменять тип массива на Single
Давай не будем подгонять тесты под язык программирования
Eсть задача - заполнить в цикле массив типа Byte из 1000000 элементов случайными значениями 0 и 1
Всё, и не надо тут приплетать различные типы и пр. не относящуюся к делу фигню, типа COM и потоки. Если есть в VB6 другая встроенная функция, способная генерировать случайные числа, то я не против её использования. Но я знаю только одну, как и 99.9 программистов, и она RND. В PureBasic аналогичная функция это Random.
Так вот решая именно эту задачу VB6 отстает примерно в 6-9 раз от PureBasic.
Остальная вода ни кого не волнует.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.01.2015, 12:51
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Давай не будем подгонять тесты под язык программирования
Я тебе привел такой же тест, только с другими типами. Если ты говоришь что типы - это фигня, то этот тест такой же как и твой, но сейчас же ты уже говоришь что я что-то подгоняю.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Всё, и не надо тут приплетать различные типы
Я не буду тебе отвечать опять по кругу.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
типа COM и потоки.
Ну ответь на мой пример, я же тебе отвечаю. Иначе я тоже буду игнорить. Ты выставил PB как фаворита по скорости перед VB6 используя просто совсем другую функцию, многократно урезанную версию Rnd, а это неправильно. Я тебе привел другой пример, который уже вполне покажет встроенные средства, удобство и их производительность и попросил тебя предоставить такое же на PB.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Если есть в VB6 другая встроенная функция, способная генерировать случайные числа, то я не против её использования.
Встроенной функции для генерации случайных целых чисел нет. В PB есть встроенная функция для генерации случайных вещественных чисел с тем же функционалом что и в Rnd? Сравнивать Random и Rnd - это тоже самое что сравнивать тачку и самолет, оба являются средствами передвижения.
0
Эксперт по электронике
6577 / 3204 / 335
Регистрация: 28.10.2011
Сообщений: 12,506
Записей в блоге: 7
10.01.2015, 12:55
Цитата Сообщение от The trick Посмотреть сообщение
Это может другая функция а не Random. Random принимает только два целочисленных параметра с Min и Max. С Rnd я могу написать так Rnd(0), или так Rnd(-1), или так Rnd(Me) и это задаст разные режимы работы. Может ли так Random?
Какая разница задается зерно в Rnd (Random) или с помощью другой функции, если в итоге результат аналогичен?
Хотя нет, судя по этой инфе в Rnd невозможно задать любое значение в качестве начального, т. е. аналога RandomSeed в VB просто нет! Так о чем спор тогда?

У меня встречный вопрос. Может ли Rnd генерировать целочисленные значения в заданном диапазоне, который намного шире чем 0...1?

По моему ясно что спор тупиковый.

Цитата Сообщение от The trick Посмотреть сообщение
99.9% юзеров используют Rnd для генерации вещественных чисел
Откуда такая информация? Дайте ссылку на авторитетный источник.
Например я не припомню чтобы нужно было генерировать именно вещественные значения и именно в диапазоне 0...1. Обычно нужны целочисленные значения в заданном диапазоне.

Цитата Сообщение от The trick Посмотреть сообщение
Интересно посмотреть как это будет выглядеть в PB или еще где-нибудь. И как быстро по времени это будет работать?
А мне интересно как будет выглядеть код на VB, который можно скомпилировать под x64 винду или даже под Linux и MacOS X?
Процитирую вас же.
Цитата Сообщение от The trick Посмотреть сообщение
ты сравниваешь холодное с красным.
VB чисто под винду x86, а PureBasic кроссплатформенный и не стоит ожидать что в нем будут нативно поддерживаться "фишки" конкретной платформы. Приведенный вами код имеет смысл только в винде, а в Linux и MacOS X нет COM объектов.
Если из PB нужно работать с COM объектами, то следует использовать сторонние библиотеки типа PureDispHelper или COMatePLUS.

Цитата Сообщение от The trick Посмотреть сообщение
Rnd - генерирует случайное вещественное число, может ли это Random? Так что Rnd() и Random(1,0) - это не одно и тоже как ты их сравниваешь.
Может ли Rnd генерировать целочисленные значения в заданном диапазоне, который намного шире чем 0...1?
Я об этом выше уже спрашивал. Тупиковый спор!
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.01.2015, 13:06
Цитата Сообщение от The trick Посмотреть сообщение
Встроенной функции для генерации случайных целых чисел нет
Т.о. ты утверждаешь, что такую тривиальную задачу как заполнить в цикле массив типа Byte из 1000000 элементов случайными значениями 0 и 1 в VB6 решить невозможно из за того, что RND не генерирует числа типа Byte ? Или ты хотел сказать что решение будет медленным? Ну я об этом и пишу!
Цитата Сообщение от The trick Посмотреть сообщение
Сравнивать Random и Rnd - это тоже самое что сравнивать тачку и самолет
Я и говорю, что создатели VB6 приделали к нему тачку, а создатели PureBasic самолет. Собственно об этом я и толкую уже вторую страницу, что RND медленный!

Цитата Сообщение от locm Посмотреть сообщение
Обычно нужны целочисленные значения в заданном диапазоне.
И тут я полностью согласен, в подавляющем большинстве случаев мы используем RND именно для генерации целых чисел в заданном диапазоне.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.01.2015, 13:12
Цитата Сообщение от locm Посмотреть сообщение
Какая разница задается зерно в Rnd (Random) или с помощью другой функции, если в итоге результат аналогичен?
Мы обсуждаем именно функцию Random и Rnd, если функция Random не поддерживает функционал Rnd, то и сравнивать нечего.
Цитата Сообщение от locm Посмотреть сообщение
Хотя нет, судя по этой инфе в Rnd невозможно задать любое значение в качестве начального, т. е. аналога RandomSeed в VB просто нет! Так о чем спор тогда?
В VB6 задается зерно с помощью процедуры Randomize, а не начальное значение. Об этом спора не было никакого.
Цитата Сообщение от locm Посмотреть сообщение
Может ли Rnd генерировать целочисленные значения в заданном диапазоне, который намного шире чем 0...1?
Нет. Можно просто умножать результат функции на какое-либо число и приводить его к целому типу.
Цитата Сообщение от locm Посмотреть сообщение
А мне интересно как будет выглядеть код на VB, который можно скомпилировать под x64 винду или даже под Linux и MacOS X.
Такого кода сделать нельзя, хотя по-моему есть Macintosh-версии VB/VBA. Если бы вопрос стоял о кроссплатформенности, то не было бы никаких споров.
Цитата Сообщение от locm Посмотреть сообщение
VB чисто под винду x86, а PureBasic кроссплатформенный и не стоит ожидать что в нем будут нативно поддерживаться "фишки" конкретной платформы. Приведенный вами код имеет смысл только в винде, а в Linux и MacOS X нет COM объектов.
Причем тут кроссплатформенность? Разве мы тут обсуждаем кроссплатформенность? Мне не важно что там нужно использовать для поддержки COM. Для VB6 тоже можно использовать сторонние библиотеки написанные хоть на ассемблере и сделать функцию для генерации случайных целых чисел. Я попросил аналог кода приведенного выше встроенными средствами, точно также как и уважаемый Pro_grammer требует от меня.
Цитата Сообщение от locm Посмотреть сообщение
Откуда такая инфа? Дайте ссылку на авторитетный источник?
Например я не припомню чтобы нужно было генерировать именно вещественные значения и именно в диапазоне 0...1. Обычно нужны целочисленные значения в заданном диапазоне.
В программировании очень часто используются случайные вещественные числа, например создать случайный вектор или при обработке сигналов - шумовая функция, например при программировании VST используются типы с плавающей запятой, и опять-таки для генерации шума используются вещественные числа и таких примеров великое множество.
Если из PB нужно работать с COM объектами, то следует использовать сторонние библиотеки типа PureDispHelper или COMatePLUS.
Цитата Сообщение от locm Посмотреть сообщение
Может ли Rnd генерировать целочисленные значения в заданном диапазоне, который намного шире чем 0...1?
Я об этом выше уже спрашивал. Тупиковый спор!
Я ответил уже.
0
Эксперт по электронике
6577 / 3204 / 335
Регистрация: 28.10.2011
Сообщений: 12,506
Записей в блоге: 7
10.01.2015, 13:19
Кстати, код из этого поста можно существенно "разогнать" если использовать RandomData.
PureBasic
1
2
3
4
5
6
7
DisableDebugger
start=ElapsedMilliseconds()
Dim arr.b(10000)
For i=1 To 10000
  RandomData(@arr(), 10000)
Next i
MessageRequester("", Str(ElapsedMilliseconds()-Start))
Выполняется за 34 мс.
Правда отсутствует деление по модулю, но непонятно зачем оно там вообще нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2015, 13:19
Помогаю со студенческими работами здесь

Примеры выполнения консольных программ в vb6
Нужны примеры выполнения консольных программ в vb6, чтобы открывалась консоль cmd и там выполнялась какая нибудь комманда, типа "netsh...

Обсуждение работы сборщика
Приветствую постоянных обитателей раздела bsod. Я вот что подумал: у пользователей периодически возникают различные трудности с...

Обсуждение релизов, фиксов и их работы
Тут можно обсуждать вышедшие релизы и фиксы Lotus Notes/Domino Информация о них постится в тему Notes/domino New Release. Бывают...

Обсуждение правильной работы mathcad
Товарищи! Подскажите, пожалуйста, работаю в Mathcad - делаю инженерные расчёты. И что-то в последнее время Mathcad стал тормозить: скопирую...

RAMDisk SoftPerfect для ускорения работы в инете
Доброго дня всем времени суток! Помогите пожалуйста разобраться, кто в теме: Решил попробовать RAMDisk SoftPerfect для ускорения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru