SAS9

SAS-Tutorial: Wie man die gesamte Ausführungszeit misst

Simon 8 vues

Wenn man versucht, SAS©-Verarbeitungen zu optimieren oder die Leistung einer Produktionskette zu überwachen, können die Standardinformationen im "Log"-Fenster frustrierend sein.

Standardmäßig zeigt SAS© die Leistungsstatistiken (Echtzeit, CPU-Zeit, Speicher) nach jedem Schritt (DATA step oder PROC) an.

1NOTE: DATA statement used (Total process time):
2 real time 0.01 seconds
3 user cpu time 0.00 seconds
4 system cpu time 0.01 seconds

Die wiederkehrende Frage ist: Wie erhält man die Summe dieser Statistiken für ein gesamtes Programm, das Dutzende aufeinanderfolgender Schritte enthält?

Hier sind die drei Hauptmethoden, von der einfachsten bis zur fortgeschrittensten.

Methode 1: Die Ausführung im "Batch"-Modus (Die native Methode)

Dies ist die unmittelbarste Lösung, wenn Sie keine Interaktivität benötigen. Wenn Sie ein SAS©-Programm im Batch-Modus (über die Befehlszeile oder einen Scheduler) ausführen, ändert SAS© sein Protokollierungsverhalten geringfügig.

Am Ende der generierten .log-Datei fügt SAS© automatisch eine statistische Zusammenfassung der gesamten Sitzung ein.

So geht's: Anstatt SAS© Enterprise Guide oder SAS© Base interaktiv zu öffnen:

  1. Starten Sie Ihr Programm über das System-Executable (z.B. sas©.exe -sysin mein_programm.sas©).

  2. Öffnen Sie die resultierende Log-Datei (mein_programm.log).

  3. Gehen Sie ganz nach unten in der Datei, um den Block "SAS© Session Statistics" zu finden.

Methode 2: Das "Log Scraping" (Die Log-Analyse)

Wenn Sie diese Leistungen historisieren müssen (z.B. um die Ausführungsgeschwindigkeit einer Verarbeitung Tag für Tag zu vergleichen), reicht das manuelle Lesen des Logs nicht aus. Die von Experten empfohlene Lösung ist die Erstellung eines kleinen Programms, das Ihre Logs "liest".

Die Idee ist, SAS© zu verwenden, um seine eigenen Textausgabedateien zu lesen.

Das Konzept:

  1. Aktivieren Sie die Option FULLSTIMER am Anfang Ihres Hauptprogramms, um maximale Details zu erhalten.

  2. Nach Abschluss des Programms starten Sie ein "Scraping"-Skript, das die .log-Datei liest.

  3. Suchen Sie nach Zeilen, die mit "real time" oder "cpu time" beginnen.

  4. Extrahieren Sie die numerischen Werte und summieren Sie sie.

Dies ist die ideale Methode, um Leistungs-Dashboards (Performance Monitoring) zu erstellen.

Methode 3: Das ARM-Subsystem (Die Pro-Methode)

Für komplexere Anforderungen (z.B. die Messung der Zeit eines spezifischen Codeabschnitts ohne Initialisierung) empfehlen wir die Verwendung von ARM (Application Response Measurement).

ARM ist ein Industriestandard für die Leistungsmessung, der in SAS© über spezifische Makros integriert ist. Dies ermöglicht die Definition benutzerdefinierter "Start"- und "End"-Transaktionen.

Konzeptionelles Beispiel:

1/* Initialisation du système ARM */
2%let _armagent=1;
3%arm_init(appname="MonApplicationCritique");
4 
5/* Début du chronomètre pour une section précise */
6%arm_start(name="Etape_Importation");
7 
8 /* ... Votre code lourd ici ... */
9 DATA work.test; SET SOURCE.big_data; RUN;
10 
11/* Fin du chronomètre et enregistrement du log */
12%arm_stop(name="Etape_Importation");
13 
14%arm_end();

Die Ergebnisse werden dann sauber in einer dedizierten Log-Datei oder einer Tabelle gespeichert, was eine präzise Analyse ohne das Parsen von Rohdaten ermöglicht.

Schnelle Alternative: Zeitmarker

Wenn Sie nicht die CPU-/Speichergenauigkeit, sondern nur die tatsächliche Dauer ("Wall clock time") für einen Codeblock benötigen, können Sie einfach Makrovariablen am Anfang und Ende Ihres Skripts verwenden:

1/* Début du chronomètre */
2%let start_time = %sysfunc(datetime());
3 
4 /* ... Vos multiples PROC et DATA steps ... */
5 PROC SORT DATA=sashelp.class out=class; BY age; RUN;
6 DATA _null_; SET class; RUN;
7 
8/* Fin et calcul */
9%let end_time = %sysfunc(datetime());
10%let duree = %sysfunc(putn(%sysevalf(&end_time - &start_time), time8.));
11 
12%put NOTE: Durée totale du traitement : &duree;