slitaz-doc-wiki-data annotate pages/en/devnotes/ash-benchmarks.txt @ rev 7

Add pages/en folder.
author Christopher Rogers <slaxemulator@gmail.com>
date Sat Feb 26 12:17:18 2011 +0000 (2011-02-26)
parents
children df9950c99d41
rev   line source
slaxemulator@7 1 Some tips to speed-up scripts... Add yours, and put the better ones on the top of page :)
slaxemulator@7 2
slaxemulator@7 3 ==== Sed substitution vs Variable substitution ====
slaxemulator@7 4
slaxemulator@7 5 **Information**
slaxemulator@7 6
slaxemulator@7 7 In some case, both tools can do the same job. As a build-in ash/bash command, variable substitution is a faster.
slaxemulator@7 8 Note: this is always true - you can compare each type of variable substitution with an equivalent using an external tool.
slaxemulator@7 9
slaxemulator@7 10 **Benchmark**
slaxemulator@7 11 <code>
slaxemulator@7 12 $ echo '#!/bin/sh
slaxemulator@7 13 for i in $(seq 1 1000); do
slaxemulator@7 14 echo "slitaz" | sed 's/slitaz/SliTaz/'
slaxemulator@7 15 done' > /tmp/slow
slaxemulator@7 16 $ echo '#!/bin/sh
slaxemulator@7 17 for i in $(seq 1 1000); do
slaxemulator@7 18 A=slitaz
slaxemulator@7 19 echo "${A/slitaz/SliTaz}"
slaxemulator@7 20 done' > /tmp/speed
slaxemulator@7 21 $ chmod +x /tmp/slow /tmp/speed
slaxemulator@7 22 $ time /tmp/slow
slaxemulator@7 23 > real 0m 12.40s
slaxemulator@7 24 $ time /tmp/speed
slaxemulator@7 25 > real 0m 0.04s
slaxemulator@7 26 </code>
slaxemulator@7 27
slaxemulator@7 28 ==== Group command vs. Sub-process ====
slaxemulator@7 29
slaxemulator@7 30 **Information**
slaxemulator@7 31
slaxemulator@7 32 Group command "{}" group several commands into one (as a function). So, output can be grouped too: "{ com1; com2; } | com3". Sub-process "()" achieve something similar, but create a shell sub-process; which cost a lot more resources. Another difference is that, when you kill an application using CTRL^C, sub-process is killed instead of main application - while CTRL^C on grouped commands kill the application itself. Finally, changing directory or variables into sub-process will not affect main script while it does with grouped commands. Conclusion: always use group command instead of sub-processes, and take care ;D
slaxemulator@7 33
slaxemulator@7 34 //Note:// group command need a newline before closing - or "; }".
slaxemulator@7 35
slaxemulator@7 36 **Benchmark**
slaxemulator@7 37 <code>
slaxemulator@7 38 $ echo '#!/bin/sh
slaxemulator@7 39 for i in $(seq 1 10000); do
slaxemulator@7 40 ( echo yo )
slaxemulator@7 41 done' > /tmp/slow
slaxemulator@7 42 $ echo '#!/bin/sh
slaxemulator@7 43 for i in $(seq 1 10000); do
slaxemulator@7 44 { echo yo; }
slaxemulator@7 45 done' > /tmp/speed
slaxemulator@7 46 $ chmod +x /tmp/slow /tmp/speed
slaxemulator@7 47 $ time /tmp/slow
slaxemulator@7 48 > real 0m 5.36s
slaxemulator@7 49 $ time /tmp/speed
slaxemulator@7 50 > real 0m 0.23s
slaxemulator@7 51 </code>
slaxemulator@7 52
slaxemulator@7 53 ==== Grep vs Fgrep ====
slaxemulator@7 54
slaxemulator@7 55 **Information**
slaxemulator@7 56
slaxemulator@7 57 fgrep is exactly the same thing that grep if you don't use patterns (^,$,*,etc.). Fgrep is optimized to handle such case, particularly when you look for several different plain patterns. A difference can be found even if you look of only one pattern.
slaxemulator@7 58
slaxemulator@7 59 **Benchmark**
slaxemulator@7 60 <code>
slaxemulator@7 61 $ echo -e "line1\nline2\nline3" > /tmp/file
slaxemulator@7 62 $ echo '#!/bin/sh
slaxemulator@7 63 for i in $(seq 1 1000); do
slaxemulator@7 64 grep 3 /tmp/file
slaxemulator@7 65 done' > /tmp/slow
slaxemulator@7 66 $ echo '#!/bin/sh
slaxemulator@7 67 for i in $(seq 1 1000); do
slaxemulator@7 68 fgrep 3 /tmp/file
slaxemulator@7 69 done' > /tmp/speed
slaxemulator@7 70 $ chmod +x /tmp/slow /tmp/speed
slaxemulator@7 71 $ time /tmp/slow
slaxemulator@7 72 > real 0m 11.87s
slaxemulator@7 73 $ time /tmp/speed
slaxemulator@7 74 > real 0m 3.21s
slaxemulator@7 75 </code>
slaxemulator@7 76
slaxemulator@7 77 ==== [ -n "text" ] vs [ "text" ] ====
slaxemulator@7 78
slaxemulator@7 79 **Information**
slaxemulator@7 80
slaxemulator@7 81 The two commands test if "text" exists. Using -n slow the process a little and weight the script a little too.
slaxemulator@7 82
slaxemulator@7 83 **Benchmark**
slaxemulator@7 84 <code>
slaxemulator@7 85 $ echo '#!/bin/sh
slaxemulator@7 86 for i in $(seq 1 1000000); do
slaxemulator@7 87 [ -n "$i" ]
slaxemulator@7 88 done' > /tmp/slow
slaxemulator@7 89 $ echo '#!/bin/sh
slaxemulator@7 90 for i in $(seq 1 1000000); do
slaxemulator@7 91 [ "$i" ]
slaxemulator@7 92 done' > /tmp/speed
slaxemulator@7 93 $ chmod +x /tmp/slow /tmp/speed
slaxemulator@7 94 $ time /tmp/slow
slaxemulator@7 95 > real 0m 15.56s
slaxemulator@7 96 $ time /tmp/speed
slaxemulator@7 97 > real 0m 14.11s
slaxemulator@7 98 </code>
slaxemulator@7 99
slaxemulator@7 100 ==== [ -z "text" ] vs [ ! "text" ] vs ! [ "text" ] ====
slaxemulator@7 101
slaxemulator@7 102 **Information**
slaxemulator@7 103
slaxemulator@7 104 Theses three commands test if text doesn't exist. [ ! "text" ] and [ -z "text" ] have a similar processing time, while ! [ "text" ] is speeder.
slaxemulator@7 105
slaxemulator@7 106 **Benchmark**
slaxemulator@7 107 <code>
slaxemulator@7 108 $ echo '#!/bin/sh
slaxemulator@7 109 for i in $(seq 1 1000000); do
slaxemulator@7 110 [ -n "$i" ]
slaxemulator@7 111 done' > /tmp/slow1
slaxemulator@7 112 $ echo '#!/bin/sh
slaxemulator@7 113 for i in $(seq 1 1000000); do
slaxemulator@7 114 [ -n "$i" ]
slaxemulator@7 115 done' > /tmp/slow2
slaxemulator@7 116 $ echo '#!/bin/sh
slaxemulator@7 117 for i in $(seq 1 1000000); do
slaxemulator@7 118 [ "$i" ]
slaxemulator@7 119 done' > /tmp/speed
slaxemulator@7 120 $ chmod +x /tmp/slow1 /tmp/slow2 /tmp/speed
slaxemulator@7 121 $ time /tmp/slow1
slaxemulator@7 122 > real 0m 15.53s
slaxemulator@7 123 $ time /tmp/slow2
slaxemulator@7 124 > real 0m 15.60s
slaxemulator@7 125 $ time /tmp/speed
slaxemulator@7 126 > real 0m 14.27s
slaxemulator@7 127 </code>
slaxemulator@7 128
slaxemulator@7 129 ==== Awk vs Cut ====
slaxemulator@7 130
slaxemulator@7 131 **Information**
slaxemulator@7 132
slaxemulator@7 133 Awk, as cut, can be used to cut a field of a line. Awk can do many other things, while cut is a tool dedicated to this usage; it's why cut is a little faster for this task.
slaxemulator@7 134
slaxemulator@7 135 **Benchmark**
slaxemulator@7 136 <code>
slaxemulator@7 137 $ echo -e "field1\tfield2\tfield3" > /tmp/file
slaxemulator@7 138 $ echo '#!/bin/sh
slaxemulator@7 139 for i in $(seq 1 5000); do
slaxemulator@7 140 awk '"'"'{ print $2 }'"'"' /tmp/file
slaxemulator@7 141 done' > /tmp/slow
slaxemulator@7 142 $ echo '#!/bin/sh
slaxemulator@7 143 for i in $(seq 5000); do
slaxemulator@7 144 cut -f2 /tmp/file
slaxemulator@7 145 done' > /tmp/speed
slaxemulator@7 146 $ chmod +x /tmp/slow /tmp/speed
slaxemulator@7 147 $ time /tmp/slow
slaxemulator@7 148 > real 0m 16.61s
slaxemulator@7 149 $ time /tmp/speed
slaxemulator@7 150 > real 0m 15.90s
slaxemulator@7 151 </code>
slaxemulator@7 152
slaxemulator@7 153 ==== [ condition1 -a condition2 ] vs [ condition1 ] && [ condition2 ] ====
slaxemulator@7 154
slaxemulator@7 155 **Information**
slaxemulator@7 156
slaxemulator@7 157 While && is a fast built-in function, in this case it uses two process (two test functions) instead one. So, using -a is a little faster, as the "AND" function itself is slower but make possible to use only one process.
slaxemulator@7 158
slaxemulator@7 159 **Benchmark**
slaxemulator@7 160 <code>
slaxemulator@7 161 $ echo '#!/bin/sh
slaxemulator@7 162 for i in $(seq 1 1000000); do
slaxemulator@7 163 [ "$i" ] && [ "$i" ]
slaxemulator@7 164 done' > /tmp/slow
slaxemulator@7 165 $ echo '#!/bin/sh
slaxemulator@7 166 for i in $(seq 1 1000000); do
slaxemulator@7 167 [ "$i" -a "$i" ]
slaxemulator@7 168 done' > /tmp/speed
slaxemulator@7 169 $ chmod +x /tmp/slow /tmp/speed
slaxemulator@7 170 $ time /tmp/slow
slaxemulator@7 171 > real 0m 23.94s
slaxemulator@7 172 $ time /tmp/speed
slaxemulator@7 173 > real 0m 22.29s
slaxemulator@7 174 </code>