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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2010, 15:53   #11
basil0
 
Аватар для basil0
 
Регистрация: 23.11.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Skif-F Посмотреть сообщение
Вариан с Integer у меня выполняется за 0,37 сек, а вариант с Boolean - за 0,29 сек. Пробуйте! Потом расскажете.
Обязательно!
Цитата:
Сообщение от Skif-F Посмотреть сообщение
Однако, однажды мне потребовалось создать массив из 1'000'000, кажется, элементов (возможно больше). Хотел сделать массив Boolean - Excel выдал ошибку "недостаточно память", пришлось делать на Integer
Ну миллион рыб отловить не реально, для нас, и аквариума такого нет, чтоб с миллионом опыты проводить Мы что попроще - 2 сотни максимум
==================
Закончены по 500 забегов на 1 000 000 иттераций
Код:
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Private Sub CommandButton1_Click()
    Range("A1").Value = "GetTickCount"
    Range("B1").Value = "Timer"
For n = 1 To 500
  b& = GetTickCount
  For i = 1 To 1000000
       a& = GetTickCount
  Next i
  Cells(n + 1, 1).Value = GetTickCount - b&
  b& = GetTickCount
  For i = 1 To 1000000
       a& = Timer
  Next i
  Cells(n + 1, 2).Value = GetTickCount - b&
Next n
End Sub
GetTickCount работает в среднем в 5.6 раза быстрее Timer-а. Различия высоко достоверны (выборки даже не перекрываются!!!).

.Время, милисек.. GetTickCount.....Timer
Среднее......................86.... ..........483
Min.............................16. ...............47
Max...........................172.. ............641
100 000 иттераций оказалось мало - примерно в половине случаев GetTickCount работал менее 1 милисек.
С уважением, Василий
basil0 вне форума Ответить с цитированием
Старый 23.11.2010, 17:12   #12
basil0
 
Аватар для basil0
 
Регистрация: 23.11.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от vikttur Посмотреть сообщение
Странно, ведь Boolean - только два значения, Integer - 65537
значений. Может быть, ошибка другим вызвана?
Странно согласен, но по другой причине размер булевой и целой переменной одинаковый:
Data type Storage size Range
Byte ............1 byte.... 0 to 255
Boolean .......2 bytes ...True or False
Integer ........2 bytes... -32,768 to 32,767
(Из справки VBA)
Проверил на коде
Код:
Private Sub CommandButton1_Click()
Const a = 134740000
Dim mas1(a) As Boolean
Dim mas2(a - 10000000) As Integer
'Dim mas3(2 * a) As Byte
    Range("A1").Value = 0
End Sub
Когда объявлен только один массив, то Boolean и Integer равнозначны = 134 750 000 элементов -> Out of Memory, а 134 740 000 элементов компилятор кушает. Для Byte всё в 2 раза больше.
Странности начинаются при двух массивах, как в примере. Во-первых резко увеличивается время компиляции - до 3-4 сек. Во-вторых идет обращение системы к жесткому диску. В-третьих и в главных, уменьшение второго массива на 10 000 000 элементов от максимума может приводить и к успешной компиляции и к - Out of Memory. Какой массив из трех объявлен по максимуму, а какой с уменьшением числа элементов роли не играет, и на вероятность Out of Memory вроде бы не влияет.
Получается, что суммарный объем переменных связан с объемом доступного места на диске в момент компиляции.

Забыл написать: два массива по максимуму = 134 740 000 элементов компилятор не кушал никогда.
С уважением, Василий

Последний раз редактировалось basil0; 23.11.2010 в 17:16. Причина: забыл добавку
basil0 вне форума Ответить с цитированием
Старый 06.12.2010, 10:20   #13
basil0
 
Аватар для basil0
 
Регистрация: 23.11.2010
Сообщений: 5
По умолчанию

Отчет о применении советов.
Переписал программу с учетом всех конкретных советов и тех идей на которых советы основаны:
убрал все лишние подпрограммы (вставленные для удобочитаемости листинга и на будущее; например вычисление дистанции между двумя точками в трехмерном пространстве); упорядочил if-ы по результатам предварительной проверки, чаще отсекающие поставил впереди.
В результате удалось сократить время выполнения расчета одного опыта (100000 повторов) с 4 минут
до 78 сек.
Большое спасибо за подсказки и советы

Skif-F If с булевской переменой оказался на быстрее примерно на 5%, чем с байтовой переменной.
С уважением, Василий
basil0 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа макроса во времени (вопрс новичка) zander Microsoft Office Excel 1 19.08.2010 17:23
Создание во время исполнения xakkkkker Общие вопросы Delphi 0 20.05.2010 17:46
оптимизация времени willhunting Фриланс 10 05.05.2010 10:43
информирование пользователя о % исполнения ADSoft JavaScript, Ajax 2 01.12.2009 03:14
оптимизация для меньшения времени выполнения Ganmaker Паскаль, Turbo Pascal, PascalABC.NET 3 19.11.2008 17:33