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

Тема в разделе "Lotus - Программирование", создана пользователем Dragon108, 2 авг 2010.

  1. Dragon108

    Dragon108 Well-Known Member

    Регистрация:
    19 янв 2010
    Сообщения:
    264
    Симпатии:
    0
    Какие есть функции (и вообще есть ли они) для засекания времени выполнения скрипта?
    Заранее спасибо.
     
  2. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    делал на java с LS2J...
    там еще лог вела (в массиве, собсно - потому и джава) и max, min, avg выдавала
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    а Timer() не проще использовать?
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    а точность не смущает? :)

    Returns the time elapsed since midnight, in seconds.
    Syntax
    Timer
    Return value
    Timer returns the number of seconds elapsed since midnight as a Single value.
     
  6. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    а чем плохо просто время брать в начале и конце скрипта?

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    xalet
    не всегда нужен весь код, чаще - его куски, особливо - время кажного цикла (буде таковые имеются)
     
  8. Darker

    Darker Гость

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

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    так что мешает печатать, в логи пихать или просто в массив. я же самый примитивный вариант нарисовал...

    :) а форум сейчас всегда таким и будет?
     
  10. turumbay

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    Darker
    вариант выше - тоже миллисекунды..., а ваш - "ущербен" привязкой к ОС :)
    вот на джава (там же)^
    http://www.breakingpar.com/bkp/home.nsf/0/...7256EAF007B2235

    есть еще System.currentTimeMillis()
    вот библа (не оптимизировал):
    Код (Text):
    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:
    Код (Text):
    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
     
  12. Darker

    Darker Гость

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

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    пока хватало )

    зы: мальчики, не сорьтесь
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    Darker
    зачем советовать ограниченные варианты? :) - такой подход, ИМХО, заслуживает порицания (привязка к ОС)
    неопытный разработчик может взять код (по незнанию), а потом будет головняк

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    <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
    работает несколько секунд...
    я "спас" человека от мучений и нашёл ошибки в данных, сэкономив кучу времени (потому как загрузка/выгрузка повторялась) :) ...
     
  16. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    to Darker: насчет размера java кода вы несправедливы :)
    суть решения lmike тоже в общем неплохо катит:
    Код (Text):
    ' вместо 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 - явный оверкил.
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.075
    Симпатии:
    300
    turumbay
    java использовалась несколько в др. ключе :)
    и есть доп. профит - возможность использования в java агентах (и прочих сущностях)
     
  18. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    <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">
    на каждого нелюбителя винды и т.п. найдется любитель. и они будут любить друг другу моск до скончания веков :)
     
  19. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Число возвращаемое Timer является дробным (Single). Про точность в хелпе сказано строчкой ниже.
    LotusScript rounds the number of seconds to the nearest hundredth.
     
Загрузка...

Поделиться этой страницей