Страницы: 1
RSS
спарка UDf против функций листа
 
Всем здравствуйте!  
в приложенном файле анализ времени расчета диапазонов с помощью СУММ как массив, СУММПРОИЗВ (куда без неё?) и двух UDF, первая пробегает диапазоны только 1 раз и записывает результат в массив, вторая только вытаскивает значение нужного элемента полученного массива  
Разница на лицо  
А можно  сделать то же без UDF?
 
То же - это что? Посчитать диапазон (формулы в файле) или посчитать время выполнения?
 
vikttur,  
то же - это научить экс пробегать диапазон 1 раз, а не столько раз, сколько формул
 
To Тухачевский: вопрос не совсем по теме, но все таки:  
вы используете для подсчета времени вот такую конструкцию:  
Public Declare Function timeGetTime Lib "winmm.dll" () As Long  
и далее работаете с timeGetTime.  
Собственно вопрос: в чем различие вашего метода, и стандартного timer?
Редко но метко ...
 
Точнее
 
на сколько точнее?
Живи и дай жить..
 
{quote}{login=слэн}{date=11.03.2011 10:48}{thema=}{post}на сколько точнее?{/post}{/quote}  
http://bytes.com/topic/access/insights/618175-timegettime-vs-timer  
If you're interested in measuring elapsed times in your Access Application, you're much better off using the timeGetTime() API Function instead of the Timer() VBA Function. There are 4 major reasons for this decision:  
__1. timeGetTime() is more accurate. The Timer() Function measure time in 'seconds' since Midnight in a single-precision floating-point value, and is not terribly accurate. timeGetTime() returns the number of 'milliseconds' that have elapsed since Windows has started and is very accurate.  
__2. timeGetTime() runs longer without 'rolling over'. Timer() rolls over every 24 hours. timeGetTime() keeps on ticking for up to 49 days before it resets the returned tick count to 0.  
__3. Calling timeGetTime() is significantly faster than calling Timer().  
__4. Calling timeGetTime() is no more complex than calling Timer(), once you've included the proper declaration as in:
 
{quote}{login=тухачевский}{date=11.03.2011 10:16}{thema=}{post}то же - это научить экс пробегать диапазон 1 раз, а не столько раз, сколько формул{/post}{/quote}  
Можно попробовать ввести одну формулу массива в диапазон ячеек (например J5:J135), расчет сделает один раз для всех ячеек:  
=МУМНОЖ((ТРАНСП($B$1:$B$3848)>=$G5:$G135)*(ТРАНСП($B$1:$B$3848)<=$H5:$H135)*ТРАНСП($C$1:$C$3848);СТРОКА($B$1:$B$3848)^0) - у меня сработала быстрее примерно на 20% обычной СУММ/СУММПРОИЗВ  
 
одна ссумирующая формула:  
=СУММ(($B$1:$B$3848>=ТРАНСП($G5:$G135))*($B$1:$B$3848<=ТРАНСП($H5:$H135))*($C$1:$C$3848))  
также работает на 20% быстрее чем 135 формул  
 
или засунуть массив условий в СУММЕСЛИМН (проверить не могу т.к. 2003)
 
МСН,  
вот спасибо!  
у меня получилось 15%
 
не нашел существенных( для меня ) преимуществ..  
 
но это два частных мнения  :)  
 
а вот так еще быстрее(почти в два раза):  
 
 
Function ddd(i As Long)  
ddd = Application.Transpose(rrr)  
End Function  
 
 
если ddd вводить как формулу массива
Живи и дай жить..
 
Что-то я с МУМНОЖ намудрил,  
вот так короче и чуть быстрее:  
=МУМНОЖ((ТРАНСП($B$1:$B$3848)>=$G5:$G135)*(ТРАНСП($B$1:$B$3848)<=$H5:$H135);$C$1:$C$3848)
 
вот такая формула, введенная как формула массива в диапазон ячеек считает очень быстро (почти как ЮДФ)  
=ВЕРОЯТНОСТЬ(B1:B3848;C1:C3848/СУММ(C1:C3848);G5:G135;H5:H135)*СУММ(C1:C3848)
 
слэн,  
а я то думал как UDF в массив загнать  
у меня быстрее в 9 раз, 1мс  
МСН,  
МУМНОЖ быстро  
=СУММ(($B$1:$B$3848>=ТРАНСП($G5:$G135))*($B$1:$B$3848<=ТРАНСП($H5:$H135))*($C$1:$C$3848)) считает что-то не то  
ВЕРОЯТНОСТЬ 19мс  
еще бы понять как она работает
 
если заранее определить массив как надо ( т.е rrr(1 to m,1 to 1)), то и transpose не понадобится(соответственно быстрее будет)
Живи и дай жить..
 
в 2007 можно еще так (тоже формула массива, вводится в диапазон):  
=СУММЕСЛИМН($C$1:$C$3848;$B$1:$B$3848;">="&G5:G135;$B$1:$B$3848;"<="&H5:H135)  
быстрее чем МУМНОЖ, но медленнее чем ВЕРОЯТНОСТЬ  
 
ЗЫ: про ВЕРОЯТНОСТЬ я у Игоря (kim) подсмотрел :)
 
{quote}{login=слэн}{date=11.03.2011 01:05}{thema=}{post}если заранее определить массив как надо ( т.е rrr(1 to m,1 to 1)), то и transpose не понадобится(соответственно быстрее будет){/post}{/quote}  
 
Слэн, а можно на примере?
 
{quote}{login=тухачевский}{date=11.03.2011 01:21}{thema=Re: }{post}а можно на примере?{/post}{/quote}  
Может так?  
без доп. массива, а сразу выводить
 
МСН  
спасибо!  
результаты получились интересные  
раньше пользовался UDF, но не передавал range в array  
На планете освоил СУММПРОИЗВ.  
А в результате VBA интереснее и проще для восприятия ИМХО
Страницы: 1
Наверх