Klocka ditt shell-kommando eller script

Tråden skapades och har fått 3 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2004-03-19 13:26

Genom att skriva 'time' framför ett kommando eller script i Terminal, kan du se hur lång tid exekveringen tog.

# Listar hur lång tid 'ls' tog. Inte speciellt anvädbart med 'ls' kanske...
time ls

real    0m0.030s
user    0m0.000s
sys     0m0.010s


# Efter att du avbrutit 'top' med 'Q'-tangenten ser du hur lång tid 'top' kördes.
time top -u

real    0m9.132s
user    0m0.290s
sys     0m1.040s


# 'time' med script kan vara mycket intressant.
time ./mysql_import.sh

real    158m14.501s
user    8m40.920s
sys     12m17.680s
  • Medlem
  • International user
  • 2004-03-19 14:06

För dom som inte är vana med tidsräkningen uppdelat i real, user och sys så betyder dom följande:

Real är tiden som det tog i fysisk tid (ska bli samma som om du sitter med ett stoppur om du hade haft samma precision).
User och sys är tiden det tog i user- och system-space. Dom tillsammans är den tid som det hade tagit om den inte hade behövt vänta på tex. att diskar ska spinna upp, lås ska öppnas och om den kunnat dra 100% av cpun. Alla program körs i userspace, men operationer mot bland annat disk och nätverk körs alltid i kerneln (systemspace).

  • Medlem
  • International user
  • 2004-03-19 16:49

Intressant! Ur detta borde man möjligen kunna analysera hur man kan optimera script. I fallet med scriptet som tog 158 minuter (!) var det ett awk-program (import.awk) kopplat till en textfil (data_3.txt på ca 70 MB) med ca 40.000 poster. Så här:

# -- shell-kommandot ----------------------
time awk -F "\t" -f ./import.awk /Users/wire/data_3.txt


# -- awk-programmet (import.awk) ----------------------
{
print "NR="NR

gsub(//," ",$4)
gsub(//,"\n",$5)
# MacDonalds-fnutten...
gsub(/`/,"\\`",$4);
gsub(/`/,"\\`",$5);

shell_cmd="MYSQL_HOME=\"/Applications/LassoProfessional6/LassoMySQL\";
CONNECT_STRING=\"bin/mysql --database=databasen --password=password --user=wire\";
$MYSQL_HOME/$CONNECT_STRING << sql_cmd\nINSERT INTO databasen (field1,field2,field3,field4,field5,field6,field7) 
VALUES (\""$2"\",\""$3"\",\""$4"\",\""$5"\",\""$6"\",\""$7"\",\""$8"\");
COMMIT;\nsql_cmd"

# "Går ur" till shellet med importen.
sql_insert=system(shell_cmd)

}

END {
print "Klart, puh..."
}
# ------------------------------------------------------

real    158m14.501s
user    8m40.920s
sys     12m17.680s
 

}

Den här frågan är ju inte lätt, men hur är teoretiski user- och sys-tiden fördelad? Jag vet att awk-programmet loggar in och ur databasen ca 40.000 gånger. Det är naturligtvis vansinnigt. Men jag slipade inte mer på detta. Scriptet gjorde jobbet. Men jag är tacksam för evenuella tips gällande optimering.

  • Medlem
  • International user
  • 2004-03-19 21:52

Jag har inte hållit på ngt med awk, men det bästa vore ju om du kunde öppna en connection till mysql och sedan skicka in kommando efter kommando så fort som du kan parsa ut datat ur textfilen. Eftersom drygt 120 minuter går åt till att vänta på annat och jag antar att du inte satt och gjorde något extremt jobbigt på datorn så gick nog det mesta åt i mysql-servern för inloggningen, ev spawning av en server för att hantera din request.

Om du testar göra det till en inloggning, berätta hur lång tid det tog.

Just det, mysql var det du körde, jag har för mig att du kan ange flera poster med ett insertkommando, så du behöver inte ens skicka ett kommando per rad.

1
Bevaka tråden