Засечка времени выполнения скрипта

Dragon108

Well-known member
19.01.2010
265
0
#1
Какие есть функции (и вообще есть ли они) для засекания времени выполнения скрипта?
Заранее спасибо.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#3
делал на java с LS2J...
там еще лог вела (в массиве, собсно - потому и джава) и max, min, avg выдавала
 

Xalet

Well-known member
08.08.2008
410
0
#6
а чем плохо просто время брать в начале и конце скрипта?

Код:
	Dim dtStart As New NotesDateTime("")
Dim dtEnd As New NotesDateTime("")
Call dtStart.SetNow
'... Код
Call dtEnd.SetNow
Ну и если надо, то можно и в массив загонять. Можно в лог писать и статистику потом готовить.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#7
xalet
не всегда нужен весь код, чаще - его куски, особливо - время кажного цикла (буде таковые имеются)
 
D

Darker

#8
Код:
	Declare Function GetTickCount Lib "kernel32" () As Long
d=GetTickCount
For i=1 To 1000
Print d
Next
Print Cstr(GetTickCount-d)
разница в миллисекундах
 

Xalet

Well-known member
08.08.2008
410
0
#9
не всегда нужен весь код, чаще - его куски, особливо - время кажного цикла (буде таковые имеются)
так что мешает печатать, в логи пихать или просто в массив. я же самый примитивный вариант нарисовал...

:) а форум сейчас всегда таким и будет?
 
13.03.2009
625
1
#10
to xalet:
NotesDateTime не особо дружит с интервалами меньше секунды. Для отладки/профилирования иногда полезны сотки... А суть ессно та же: меряем в начале, в конце и выводим дельту.
А что не так с форумом? Если режим отображения поломался( появилось дерево ) - то это возможно мой косяк. Я ниже ссылку дал с &mode=threaded. После перехода по ссылке весь форум начинает открываца в таком виде... Исправляеца в "Опциях".

to Darker
ага. Lib "kernel32" - самое оно для серверного агента под os400 :) Нафига использовать внешние либы, когда есть штатные документированные средства, делающие абсолютно то же самое?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#11
Darker
вариант выше - тоже миллисекунды..., а ваш - "ущербен" привязкой к ОС :)
вот на джава (там же)^
http://www.breakingpar.com/bkp/home.nsf/0/...7256EAF007B2235

есть еще System.currentTimeMillis()
вот библа (не оптимизировал):
Код:
package org.performance;
import java.util.*;
public class Timer {
private String[] rows;
private ArrayList elapsed=new ArrayList();
private long max=0;
private long min=0;
private long sum=0;
private int count=-1;
private long last=0;
final short STATUS_STOPPED=0;	
final short STATUS_STARTED=1;
final short STATUS_PAUSED=2;
private short status=STATUS_STOPPED;
private boolean nodetailsFlag=false;
private final String[] template={"Кол-во:",";суммарно:",";максимально:",";минимально:",";среднее:"};
public Timer(){
}
public void start(){
switch (status) {
case STATUS_STOPPED:
elapsed.clear();
count=-1;
sum=0;
case STATUS_PAUSED:
last=System.currentTimeMillis();
if (!nodetailsFlag) {
elapsed.add(new Long(last));
}
count+=1;
status=STATUS_STARTED;
}
}
public void setNoDetails(boolean nodetails){
nodetailsFlag=nodetails;
}
public void pause(){
if (status==STATUS_STARTED) {
long l=System.currentTimeMillis() - last;
max = ((l > max) ? l : max);
min=((min==0) ? l : ((l<min) ? l : min));
sum+=l;
if (!nodetailsFlag) {
elapsed.set(count,new Long(l));
if (count>0) {elapsed.set(count-1,((Long)elapsed.get(count-1)).toString());} //преобразование в строку предыдущего значения
}

status=STATUS_PAUSED;
}
}
public String[] getDetails(){
//		if (1==1) {return new String[]{"1","2"};}
if (nodetailsFlag){return new String[]{};}
switch (status) {
case STATUS_STOPPED:
rows=new String[elapsed.size()];
elapsed.toArray(rows);
System.out.println("size:"+elapsed.size()+";first:" + rows[0]);
return rows;
}
return new String[]{};
}
public String stop(){
switch (status) {
case STATUS_STARTED:pause();
case STATUS_PAUSED:
if (!nodetailsFlag) {
elapsed.set(count,((Long)elapsed.get(count)).toString()); //преобразование в строку
}
break;
default: return "";
}
status=STATUS_STOPPED;

StringBuffer sb=new StringBuffer();
//суммарные параметры
int c=count+1;
Double avg= new Double((new Long(sum)).doubleValue()/c);
sb.append(template[0]);sb.append(new Integer(c));
sb.append(template[1]);sb.append(new Long(sum));
sb.append(template[2]);sb.append(new Long(max));
sb.append(template[3]);sb.append(new Long(min));
sb.append(template[4]);sb.append(avg);
return sb.toString();
}
}
LS2J:
Код:
Option Public
Option Declare
Use "ErrorHandling"
Uselsx "*lsxlc"
Use "Performance"

Const ERRBASE_PERFORMANCE=1100
Const ERRLS2JINIT=ERRBASE_PERFORMANCE+1, CS_ERRLS2JINIT={ошибка инициализации класса Java}
Class Performance As ErrorHandlerWJ
Private PerformanceObj	As JavaObject
Private PerformanceClass As JavaClass
Private perfName As String
Private noDetails As Boolean
Sub New(xName As String, woDetails As Boolean)
Dim fail As Boolean
On Error Goto errorhandler
Set PerformanceClass = jSession.GetClass("org.performance.Timer")
Set PerformanceObj = PerformanceClass.CreateObject
perfName=xName
If woDetails Then
Call PerformanceObj.setNoDetails(woDetails)
noDetails=woDetails
End If
ExitFunction:
If fail Then 
On Error Goto 0
Error ERRLS2JINIT, CS_ERRLS2JINIT
End If
Exit Sub
errorhandler:
Call Me.RaiseError()
fail=True
Resume ExitFunction
End Sub
'********************************
Sub Delete()
If Not PerformanceObj Is Nothing Then
Delete PerformanceObj
End If
End Sub
'********************************
Sub StartT()
On Error Goto errorhandler
Call PerformanceObj.start()
ExitFunction:
Exit Sub
errorhandler:
Call Me.RaiseError()
Resume ExitFunction
End Sub
'********************************
Sub PauseT()
On Error Goto errorhandler
Call PerformanceObj.pause()
ExitFunction:
Exit Sub
errorhandler:
Call Me.RaiseError()
Resume ExitFunction
End Sub
'********************************	
Function StopT() As String
On Error Goto errorhandler
StopT = "Показатель "& perfName & {>} & PerformanceObj.stop()
ExitFunction:
Exit Function
errorhandler:
Call Me.RaiseError()
Resume ExitFunction
End Function
'********************************	
Function GetDetails() As Variant
On Error Goto errorhandler
If Not noDetails Then 
GetDetails=PerformanceObj.getDetails()
End If
ExitFunction:
Exit Function
errorhandler:
Call Me.RaiseError()
Resume ExitFunction
End Function
End Class
 
D

Darker

#12
lmike, а ваш - короток, у вас привычка сразу же накидываться, вам сразу же панацею от всех бед подавай, разве автор уточнил, что агент на серваке, или у него не винда?

to turumbay, согласен про GethreadInfo
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#14
Darker
зачем советовать ограниченные варианты? :) - такой подход, ИМХО, заслуживает порицания (привязка к ОС)
неопытный разработчик может взять код (по незнанию), а потом будет головняк

мой вариант (если посмотреть внимательно) осущ. дополнительные действия...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#15
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"ОФФ подходы к разработке"</div></div><div class="sp-body"><div class="sp-content">есть подходы, кот. у меня вызывают недоумение и неприятие...
-использование КОМ - где ни попадя
-испольшзование Экселя, для чего ни попадя
-использование винды - по любому поводу
в большинстве из указанных случаев - получим неудобство и тормоза
Пример из жизни... У нас внедряют САП, чел, кот. отвечает за загрузку/выгрузку данных юзает хехель.
есть исх. данные - 80тыс. строк, результат - 76 тыс.
как проверить соответствие (что загрузилос, что лишнее "образовалось")?
"классика жанра" - чел. берёт хехель и пишет vlookup (офис 2007), считает минут 20-ть (а то и дольше), с жуткими тормозами (а порой зависонами)
подход рациональный :
$grep -vnFf 2-SAP-CC\(woCol\)UTF8-clean.csv 1-SUN-SAP-CC\(woCol\)UTF8_clean.txt.csv > diffUTF8_clean.txt
$ grep -vnFf 1-SUN-SAP-CC\(woCol\)UTF8_clean.txt.csv 2-SAP-CC\(woCol\)UTF8-clean.csv > diffUTF8_SAP.txt
работает несколько секунд...
я "спас" человека от мучений и нашёл ошибки в данных, сэкономив кучу времени (потому как загрузка/выгрузка повторялась) :) ...
 
13.03.2009
625
1
#16
to Darker: насчет размера java кода вы несправедливы :)
суть решения lmike тоже в общем неплохо катит:
Код:
' вместо Declare Function GetTickCount Lib "kernel32" () As Long:
Uselsx "*javacon"
Function getCurrentTimeMillis() As Double
Dim jsession As New JavaSession
getCurrentTimeMillis = jsession.getClass("java.lang.System").currentTimeMillis()
End Function
' Usage:
Sub Click(Source As Button)
Dim startTic As Double
Dim seconds As Double
startTic = getCurrentTimeMillis()
' your code goes here
seconds = ( getCurrentTimeMillis() - startTic)/1000
Print "Finished. The code ran for " & Format$(seconds, "##0.00") & " seconds."
End Sub
хотя в свете существования getthreadinfo - использование здесь java - явный оверкил.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#17
turumbay
java использовалась несколько в др. ключе :)
и есть доп. профит - возможность использования в java агентах (и прочих сущностях)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#18
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">в поддержку "ОФФ подходы к разработке"</div></div><div class="sp-body"><div class="sp-content">
есть подходы, кот. у меня вызывают недоумение и неприятие
на каждого нелюбителя винды и т.п. найдется любитель. и они будут любить друг другу моск до скончания веков :)