Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Результаты опроса: Аналогичный расчёт, написанный в Вашей любимой среде разработки, быстрее (как думаете?)?
Не знаю — не пробовал(а). 1 25.00%
Скорее да. 3 75.00%
Скорее нет. 0 0%
Моя среда — VBE, так что ни быстрее и ни медленнее! 0 0%
Голосовавшие: 4. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2009, 02:09   #1
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Быстродействие VBA

В книге «VBA для „чайников”» сказано (шутя) о быстродействии Power Basic.

В связи с этим, а также преждевременной кончиной темы, прилагаю программу, запускаемую по Alt-s.

Впрочем, вступление писано в спешке, но кто интересутся — тот не зря потратит время.
Вложения
Тип файла: doc PalindromDecPrimes.doc (50.0 Кб, 37 просмотров)

Последний раз редактировалось Sasha_Smirnov; 15.11.2009 в 02:18.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 15.11.2009, 07:31   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Нужно попробовать.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 15.11.2009, 13:19   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Под Windows XP для чисел до 500 000 000 моя программа находит все 3484 простых числа (вида АБВ *** ВБА — то есть симметричных), и делает она это за 115 секунд при частоте процессора 2,4 ГГц (что важно: при 0,2 ГГц — тот же расчёт идёт минут 40). При всём при этом за секунду анализируется (на их простоту) около 5 млн (4371584 по счётчику) чисел.

Для чисел включительно до 200 000 000 время 42 секунды. До 1 млн — меньше секунды.

Вот «переиспытал» на пределе 500 миллионов — отключив в документе автоматическую и контекстную проверку орфографии: 5,1 млн номеров в секунду и соответственно 98 секунд работы, вместе с печатью (в файл).

Преобразование в таблицу полученных 3484 строк заняло ещё секунд 6.

Последний раз редактировалось Sasha_Smirnov; 16.11.2009 в 12:14. Причина: уборка лишнего, добавка нужного!
Sasha_Smirnov вне форума Ответить с цитированием
Старый 18.11.2009, 23:59   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Добавил шестнадцатеричный и четверичный (запуск по альт-шифт-S) вид. Кстати, опрос ещё открыт!

Убоявшимся лезть внутрь — вот замечательный фрагмент (система счисления на выбор!). За English не ручаюсь.
Код:
MsgBox IIf(Application.Keyboard = 68748313, "Выбор основания системы счисления...", "Choosing of numeration base...")

Do
answer = MsgBox("16?", vbQuestion + vbYesNoCancel): NBase = 16
    Select Case answer
    Case vbCancel:  Exit Sub
    Case vbYes:     Exit Do
    End Select
    
answer = MsgBox("10?", vbQuestion + vbYesNoCancel): NBase = 10
    Select Case answer
    Case vbCancel:  Exit Sub
    Case vbYes:     Exit Do
    End Select
    
answer = MsgBox("8?", vbQuestion + vbYesNoCancel): NBase = 8
    Select Case answer
    Case vbCancel:  Exit Sub
    Case vbYes:     Exit Do
    End Select
    
answer = MsgBox("4?", vbQuestion + vbYesNoCancel): NBase = 4
    Select Case answer
    Case vbCancel:  Exit Sub
    Case vbYes:     Exit Do
    End Select
    
answer = MsgBox("2?", vbQuestion + vbYesNoCancel): NBase = 2
    Select Case answer
    Case vbCancel:  Exit Sub
    Case vbYes:     Exit Do
    End Select
Loop
В качестве «гимнастики ума» предлагаю сократить.
Вложения
Тип файла: doc BinQuaOctDecHexPrimes.doc (57.5 Кб, 18 просмотров)

Последний раз редактировалось Sasha_Smirnov; 19.11.2009 в 17:49. Причина: предложение.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 19.11.2009, 23:01   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Get it!

Да... Четверичный вид раз в 15 замедлил подсчёт.

На отрезке до 510 млн 3647 Hex-перевёртышей (из имеющихся 26 854 252 простых чисел) моя программа нашла за 32 мин (точнее, 1914 с).

При том что было отключено автосохранение и проверка орфографии, а также аваст.

Док с листингом прилагаю. (Листинг в смысле «список».)

Ну какой язык то же самое (в пяти системах счисления) даёт минут за 5 хотя бы?
Вложения
Тип файла: rar PrimeGets.rar (68.3 Кб, 16 просмотров)

Последний раз редактировалось Sasha_Smirnov; 20.11.2009 в 04:47. Причина: 3647 + исправленный архив.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 22.11.2009, 16:30   #6
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Но в том и прелесть алгоритма, что не надо хранить архивы.

Как обнаружил Тоха с киберфорума, 2 число простое! Ниже я это учёл.
Вложения
Тип файла: doc GetPrimes.doc (65.5 Кб, 19 просмотров)

Последний раз редактировалось Sasha_Smirnov; 23.11.2009 в 05:11. Причина: проба подписи.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 18.08.2010, 07:59   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Быстродействие в действии. Умном

Более удачным полигоном оказалась тема от Simbad 8 марта 2010:
http://programmersforum.ru/showthread.php?p=473254

И вообще гости как-то активнее, да? 2 месяца не отставал; заодно и русский подтянул (что нам студентам как бы и не к лицу)! И даже 1 реферал имеет... а я так и не понял, где их брать.

Последний раз редактировалось Sasha_Smirnov; 18.08.2010 в 08:02.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 18.08.2010, 14:25   #8
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Небольшое (порядка 5%) ускорение без изменения алгоритма:
Код:
Dim M As Long
M = Fix(Sqr(N))
For i = 3 To M Step 2
    If flags(i) = 1 Then
        For j = i + i To N Step i
            flags(j) = 0
        Next j
    End If
Next i
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 18.08.2010, 16:43   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

5% хорошо! 3 секунды за минуту. Но на 3 порядка... я был поражён.

5%, видимо, даёт однократное (а не в каждом цикле) вычисление корня?
Sasha_Smirnov вне форума Ответить с цитированием
Старый 19.08.2010, 09:58   #10
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Не только.
Замена цикла Do...Loop на For...Next, тоже даёт некоторый прирост (2-3%). Суди сам, операции:
Код:
j = i + i
Do While j <= N
     ...
     j = j + i
Loop
заменяем на:
Код:
For j = i + i To N Step i
   ...
Next j
Вообще, году в 93-95 купил я книгу "128 советов начинающему программисту" - рекомендую прочитать, если найдёте (несмотря на давность, своей актуальности она не потеряла) - там много "советов" было посвящено именно оптимизации программ по времени выполнения. Вот я и применяю на практике то, что помню.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
быстродействие Access по сети Tatu Microsoft Office Access 2 20.10.2009 13:48
VBA 6.0 Maxs Софт 6 22.05.2009 15:40
VBA LLIypLLIyH Помощь студентам 2 27.10.2008 07:59