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> |