0xBenchmark: Stop using fork() in native benchmarks.
[0xbench:0xbench.git] / src / org / opensolaris / hub / libmicro / NativeTesterMicro.java
1 /*
2  * Copyright (C) 2011 Linaro Limited
3  * Copyright (C) 2010 0xlab - http://0xlab.org/
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * Authored by Joseph Chang (bizkit) <bizkit@0xlab.org>
18  */
19
20 package org.opensolaris.hub.libmicro;
21
22 import org.zeroxlab.zeroxbenchmark.*;
23
24 import android.os.Bundle;
25 import android.content.Intent;
26 import android.util.Log;
27
28 import java.util.Arrays;
29 import java.util.ArrayList;
30 import java.util.List;
31
32 public class NativeTesterMicro extends NativeTester {
33
34     public final String TAG = "TesterLibMicro";
35     private final double ERROR_VALUE = -1.0;
36     public static final String REPORT = "REPORT";
37     public static final String RESULT = "RESULT";
38     private static final String Opts = "-E -C 70 -L -S -W";
39     public static final List<String> COMMANDS  = Arrays.asList(
40
41         "getpid " + Opts + " -N getpid -I 5",
42
43         "getenv " + Opts + " -N getenv   -s 100 -I 100",
44         "getenv " + Opts + " -N getenvT2   -s 100 -I 100 -T 2",
45
46         "gettimeofday " + Opts + " -N gettimeofday",
47
48         "log " + Opts + " -N log  -I 20",
49
50         "exp " + Opts + " -N exp  -I 20",
51
52         "lrand48 " + Opts + " -N lrand48",
53
54         "memset " + Opts + " -N memset_10       -s 10   -I 10 ",
55         "memset " + Opts + " -N memset_256      -s 256  -I 20",
56         "memset " + Opts + " -N memset_256_u    -s 256   -a 1 -I 20 ",
57         "memset " + Opts + " -N memset_1k       -s 1k    -I 100",
58         "memset " + Opts + " -N memset_4k    -s 4k    -I 250",
59         "memset " + Opts + " -N memset_4k_uc -s 4k    -u -I 400",
60         "memset " + Opts + " -N memset_10k      -s 10k  -I 600   ",
61         "memset " + Opts + " -N memset_1m       -s 1m   -I 200000",
62 //        "memset " + Opts + " -N memset_10m    -s 10m -I 2000000 ",
63 //        "memset " + Opts + " -N memsetP2_10m  -s 10m -P 2 -I 2000000 ",
64
65 //        "memrand " + Opts + " -N memrand      -s 128m -B 10000",
66
67         "isatty " + Opts + " -N isatty_yes   ",
68 //        "isatty " + Opts + " -N isatty_no  -f $IFILE",
69
70         "malloc " + Opts + " -N malloc_10    -s 10    -g 10 -I 50",
71         "malloc " + Opts + " -N malloc_100   -s 100   -g 10 -I 50",
72         "malloc " + Opts + " -N malloc_1k    -s 1k    -g 10 -I 50",
73         "malloc " + Opts + " -N malloc_10k   -s 10k   -g 10 -I 50",
74         "malloc " + Opts + " -N malloc_100k  -s 100k  -g 10 -I 2000",
75
76         "malloc " + Opts + " -N mallocT2_10    -s 10   -g 10 -T 2 -I 200",
77         "malloc " + Opts + " -N mallocT2_100   -s 100  -g 10 -T 2 -I 200",
78         "malloc " + Opts + " -N mallocT2_1k    -s 1k   -g 10 -T 2 -I 200",
79         "malloc " + Opts + " -N mallocT2_10k   -s 10k  -g 10 -T 2 -I 200",
80         "malloc " + Opts + " -N mallocT2_100k  -s 100k -g 10 -T 2 -I 10000",
81
82         "close " + Opts + " -N close_bad                -B 32           -b",
83 //        "close " + Opts + " -N close_tmp              -B 32           -f $TFILE",
84 //        "close " + Opts + " -N close_usr              -B 32           -f $VFILE",
85         "close " + Opts + " -N close_zero               -B 32           -f /dev/zero",
86
87         "memcpy " + Opts + " -N memcpy_10       -s 10   -I 10 ",
88         "memcpy " + Opts + " -N memcpy_1k       -s 1k   -I 50",
89         "memcpy " + Opts + " -N memcpy_10k      -s 10k  -I 800",
90 //        "memcpy " + Opts + " -N memcpy_1m     -s 1m   -I 500000",
91 //        "memcpy " + Opts + " -N memcpy_10m    -s 10m  -I 5000000",
92
93         "strcpy " + Opts + " -N strcpy_10       -s 10   -I 5 ",
94         "strcpy " + Opts + " -N strcpy_1k       -s 1k   -I 100",
95
96         "strlen " + Opts + " -N strlen_10       -s 10   -I 5",
97         "strlen " + Opts + " -N strlen_1k       -s 1k   -I 100",
98
99         "strchr " + Opts + " -N strchr_10       -s 10   -I 5",
100         "strchr " + Opts + " -N strchr_1k       -s 1k   -I 200",
101         "strcmp " + Opts + " -N strcmp_10       -s 10   -I 10",
102         "strcmp " + Opts + " -N strcmp_1k       -s 1k   -I 200",
103
104         "strcasecmp " + Opts + " -N scasecmp_10 -s 10 -I 50",
105         "strcasecmp " + Opts + " -N scasecmp_1k -s 1k -I 20000",
106
107         "strtol " + Opts + " -N strtol      -I 20      ",
108
109         "mutex " + Opts + " -N mutex_st -I 10",
110         "mutex " + Opts + " -N mutex_mt -t -I 10        ",
111         "mutex " + Opts + " -N mutex_T2     -T 2  -I 100",
112
113 //        "longjmp " + Opts + " -N longjmp      -I 10",
114 //        "siglongjmp " + Opts + " -N siglongjmp        -I 20",
115
116         "getrusage " + Opts + " -N getrusage    -I 200",
117
118         "times " + Opts + " -N times    -I 200",
119         "time " + Opts + " -N time              -I 50",
120         "localtime_r " + Opts + " -N localtime_r        -I 200  ",
121         "strftime " + Opts + " -N strftime -I 10000  ",
122
123         "mktime " + Opts + " -N mktime       -I 500   ",
124         "mktime " + Opts + " -N mktimeT2 -T 2 -I 1000 ",
125
126 //        "cascade_mutex " + Opts + " -N c_mutex_1      -I 50",
127 //        "cascade_mutex " + Opts + " -N c_mutex_10     -T 10 -I 5000",
128 //        "cascade_mutex " + Opts + " -N c_mutex_200    -T 200  -I 2000000",
129
130 //        "cascade_cond " + Opts + " -N c_cond_1        -I 100",
131 //        "cascade_cond " + Opts + " -N c_cond_10       -T 10   -I 3000",
132 //        "cascade_cond " + Opts + " -N c_cond_200      -T 200  -I 2000000",
133
134         "cascade_flock " + Opts + " -N c_flock  -I 1000 ",
135         "cascade_flock " + Opts + " -N c_flock_10       -T 10   -I 50000",
136         "cascade_flock " + Opts + " -N c_flock_200      -T 200  -I 5000000",
137
138         "cascade_fcntl " + Opts + " -N c_fcntl_1        -I 2000         ",
139         "cascade_fcntl " + Opts + " -N c_fcntl_10       -T 10 -I 20000",
140         "cascade_fcntl " + Opts + " -N c_fcntl_200      -T 200  -I 5000000",
141
142         "file_lock " + Opts + " -N file_lock   -I 1000         ",
143
144         "getsockname " + Opts + " -N getsockname        -I 100",
145         "getpeername " + Opts + " -N getpeername        -I 100",
146
147 //        "chdir " + Opts + " -N chdir_tmp      -I 2000         $TDIR1 $TDIR2",
148 //        "chdir " + Opts + " -N chdir_usr      -I 2000         $VDIR1 $VDIR2",
149 //
150 //        "chdir " + Opts + " -N chgetwd_tmp    -I 3000 -g $TDIR1 $TDIR2",
151 //        "chdir " + Opts + " -N chgetwd_usr    -I 3000 -g $VDIR1 $VDIR2",
152 //
153 //        "realpath " + Opts + " -N realpath_tmp -I 3000                -f $TDIR1",
154 //        "realpath " + Opts + " -N realpath_usr        -I 3000 -f $VDIR1",
155 //
156 //        "stat " + Opts + " -N stat_tmp -I 1000                -f $TFILE",
157 //        "stat " + Opts + " -N stat_usr -I 1000                -f $VFILE",
158
159 //        "fcntl " + Opts + " -N fcntl_tmp      -I 100  -f $TFILE",
160 //        "fcntl " + Opts + " -N fcntl_usr      -I 100  -f $VFILE",
161         "fcntl_ndelay " + Opts + " -N fcntl_ndelay      -I 100  ",
162
163 //        "lseek " + Opts + " -N lseek_t8k      -s 8k   -I 50   -f $TFILE",
164 //        "lseek " + Opts + " -N lseek_u8k      -s 8k   -I 50   -f $VFILE",
165
166 //        "open " + Opts + " -N open_tmp                -B 256          -f $TFILE",
167 //        "open " + Opts + " -N open_usr                -B 256          -f $VFILE",
168         "open " + Opts + " -N open_zero         -B 256          -f /dev/zero",
169
170         "dup " + Opts + " -N dup                        -B 512   ",
171
172         "socket " + Opts + " -N socket_u                -B 256",
173         "socket " + Opts + " -N socket_i                -B 256          -f PF_INET",
174
175         "socketpair " + Opts + " -N socketpair          -B 256",
176
177         "setsockopt " + Opts + " -N setsockopt          -I 200",
178
179         "bind " + Opts + " -N bind                      -B 100",
180
181         "listen " + Opts + " -N listen          -B 100",
182
183 //        "connection " + Opts + " -N connection                -B 256 ",
184
185         "poll " + Opts + " -N poll_10   -n 10   -I 500",
186         "poll " + Opts + " -N poll_100  -n 100  -I 1000",
187         "poll " + Opts + " -N poll_1000 -n 1000 -I 5000",
188
189         "poll " + Opts + " -N poll_w10  -n 10   -I 500          -w 1",
190         "poll " + Opts + " -N poll_w100 -n 100  -I 2000         -w 10",
191         "poll " + Opts + " -N poll_w1000        -n 1000 -I 40000        -w 100",
192
193         "select " + Opts + " -N select_10       -n 10   -I 500",
194         "select " + Opts + " -N select_100      -n 100  -I 1000",
195         "select " + Opts + " -N select_1000     -n 1000 -I 5000",
196
197         "select " + Opts + " -N select_w10      -n 10   -I 500          -w 1",
198         "select " + Opts + " -N select_w100     -n 100  -I 2000         -w 10",
199         "select " + Opts + " -N select_w1000    -n 1000 -I 40000        -w 100",
200
201         "sigaction " + Opts + " -N sigaction -I 100",
202         "signal " + Opts + " -N signal -I 1000",
203         "sigprocmask " + Opts + " -N sigprocmask -I 200",
204
205         "pthread_create   " + Opts + " -N pthread_8             -B 8",
206         "pthread_create   " + Opts + " -N pthread_32            -B 32",
207         "pthread_create   " + Opts + " -N pthread_128           -B 128",
208 //        "pthread_create   " + Opts + " -N pthread_512         -B 512",
209
210 //        "fork " + Opts + " -N fork_10         -B 10",
211 //        "fork " + Opts + " -N fork_100                -B 100  -C 100",
212 //        "fork " + Opts + " -N fork_1000               -B 1000 -C 50",
213
214 //        "exit " + Opts + " -N exit_10         -B 10",
215 //        "exit " + Opts + " -N exit_100                -B 100",
216 //        "exit " + Opts + " -N exit_1000               -B 1000 -C 50",
217
218 //        "exit " + Opts + " -N exit_10_nolibc  -e -B 10",
219
220 //        "exec " + Opts + " -N exec -B 10",
221
222         "system " + Opts + " -N system -I 1000000",
223
224         "recurse " + Opts + " -N recurse                -B 512",
225
226 //        "read " + Opts + " -N read_t1k        -s 1k                   -f $TFILE",
227 //        "read " + Opts + " -N read_t10k       -s 10k                  -f $TFILE",
228 //        "read " + Opts + " -N read_t100k      -s 100k                 -f $TFILE",
229
230 //        "read " + Opts + " -N read_u1k        -s 1k                   -f $VFILE",
231 //        "read " + Opts + " -N read_u10k       -s 10k                  -f $VFILE",
232 //        "read " + Opts + " -N read_u100k      -s 100k                 -f $VFILE",
233
234         "read " + Opts + " -N read_z1k  -s 1k                   -f /dev/zero ",
235         "read " + Opts + " -N read_z10k -s 10k                  -f /dev/zero ",
236         "read " + Opts + " -N read_z100k        -s 100k                 -f /dev/zero ",
237         "read " + Opts + " -N read_zw100k       -s 100k          -w     -f /dev/zero ",
238
239 //        "write " + Opts + " -N write_t1k      -s 1k                   -f $TFILE",
240 //        "write " + Opts + " -N write_t10k     -s 10k                  -f $TFILE",
241 //        "write " + Opts + " -N write_t100k    -s 100k                 -f $TFILE",
242
243 //        "write " + Opts + " -N write_u1k      -s 1k                   -f $VFILE",
244 //        "write " + Opts + " -N write_u10k     -s 10k                  -f $VFILE",
245 //        "write " + Opts + " -N write_u100k    -s 100k                 -f $VFILE",
246
247         "write " + Opts + " -N write_n1k        -s 1k   -I 100 -B 0     -f /dev/null ",
248         "write " + Opts + " -N write_n10k       -s 10k  -I 100 -B 0     -f /dev/null ",
249         "write " + Opts + " -N write_n100k      -s 100k -I 100 -B 0     -f /dev/null ",
250
251 //        "writev " + Opts + " -N writev_t1k    -s 1k                   -f $TFILE",
252 //        "writev " + Opts + " -N writev_t10k   -s 10k                  -f $TFILE",
253 //        "writev " + Opts + " -N writev_t100k  -s 100k                 -f $TFILE",
254
255 //        "writev " + Opts + " -N writev_u1k    -s 1k                   -f $VFILE",
256 //        "writev " + Opts + " -N writev_u10k   -s 10k                  -f $VFILE",
257 //        "writev " + Opts + " -N writev_u100k  -s 100k                 -f $VFILE",
258
259         "writev " + Opts + " -N writev_n1k      -s 1k   -I 100 -B 0     -f /dev/null ",
260         "writev " + Opts + " -N writev_n10k     -s 10k  -I 100 -B 0     -f /dev/null ",
261         "writev " + Opts + " -N writev_n100k    -s 100k -I 100 -B 0     -f /dev/null ",
262
263 //        "pread " + Opts + " -N pread_t1k      -s 1k   -I 300          -f $TFILE",
264 //        "pread " + Opts + " -N pread_t10k     -s 10k  -I 1000         -f $TFILE",
265 //        "pread " + Opts + " -N pread_t100k    -s 100k -I 10000        -f $TFILE",
266
267 //        "pread " + Opts + " -N pread_u1k      -s 1k   -I 300          -f $VFILE",
268 //        "pread " + Opts + " -N pread_u10k     -s 10k  -I 1000         -f $VFILE",
269 //        "pread " + Opts + " -N pread_u100k    -s 100k -I 10000        -f $VFILE",
270
271         "pread " + Opts + " -N pread_z1k        -s 1k   -I 300          -f /dev/zero ",
272         "pread " + Opts + " -N pread_z10k       -s 10k  -I 1000         -f /dev/zero ",
273         "pread " + Opts + " -N pread_z100k      -s 100k -I 2000 -f /dev/zero ",
274         "pread " + Opts + " -N pread_zw100k     -s 100k -w -I 10000     -f /dev/zero ",
275
276 //        "pwrite " + Opts + " -N pwrite_t1k    -s 1k   -I 500          -f $TFILE",
277 //        "pwrite " + Opts + " -N pwrite_t10k   -s 10k  -I 1000         -f $TFILE",
278 //        "pwrite " + Opts + " -N pwrite_t100k  -s 100k -I 10000        -f $TFILE",
279
280 //        "pwrite " + Opts + " -N pwrite_u1k    -s 1k   -I 500          -f $VFILE",
281 //        "pwrite " + Opts + " -N pwrite_u10k   -s 10k  -I 1000         -f $VFILE",
282 //        "pwrite " + Opts + " -N pwrite_u100k  -s 100k -I 20000        -f $VFILE",
283
284         "pwrite " + Opts + " -N pwrite_n1k      -s 1k   -I 100          -f /dev/null ",
285         "pwrite " + Opts + " -N pwrite_n10k     -s 10k  -I 100          -f /dev/null ",
286         "pwrite " + Opts + " -N pwrite_n100k    -s 100k -I 100          -f /dev/null ",
287
288         "mmap " + Opts + " -N mmap_z8k  -l 8k   -I 1000         -f /dev/zero",
289         "mmap " + Opts + " -N mmap_z128k        -l 128k -I 2000         -f /dev/zero",
290 //        "mmap " + Opts + " -N mmap_t8k        -l 8k   -I 1000         -f $TFILE",
291 //        "mmap " + Opts + " -N mmap_t128k      -l 128k -I 1000         -f $TFILE",
292 //        "mmap " + Opts + " -N mmap_u8k        -l 8k   -I 1000         -f $VFILE",
293 //        "mmap " + Opts + " -N mmap_u128k      -l 128k -I 1000         -f $VFILE",
294         "mmap " + Opts + " -N mmap_a8k  -l 8k   -I 200          -f MAP_ANON",
295         "mmap " + Opts + " -N mmap_a128k        -l 128k -I 200          -f MAP_ANON",
296
297
298         "mmap " + Opts + " -N mmap_rz8k -l 8k   -I 2000 -r      -f /dev/zero",
299         "mmap " + Opts + " -N mmap_rz128k       -l 128k -I 2000 -r      -f /dev/zero",
300 //        "mmap " + Opts + " -N mmap_rt8k       -l 8k   -I 2000 -r      -f $TFILE",
301 //        "mmap " + Opts + " -N mmap_rt128k     -l 128k -I 20000 -r     -f $TFILE",
302 //        "mmap " + Opts + " -N mmap_ru8k       -l 8k   -I 2000 -r      -f $VFILE",
303         "mmap " + Opts + " -N mmap_ru128k       -l 128k -I 20000 -r     -f $VFILE",
304         "mmap " + Opts + " -N mmap_ra8k -l 8k   -I 2000 -r      -f MAP_ANON",
305         "mmap " + Opts + " -N mmap_ra128k       -l 128k -I 20000 -r     -f MAP_ANON",
306         "mmap " + Opts + " -N mmap_wz8k -l 8k   -I 5000 -w      -f /dev/zero",
307         "mmap " + Opts + " -N mmap_wz128k       -l 128k -I 50000 -w     -f /dev/zero",
308 //        "mmap " + Opts + " -N mmap_wt8k       -l 8k   -I 5000 -w      -f $TFILE",
309 //        "mmap " + Opts + " -N mmap_wt128k     -l 128k -I 50000 -w     -f $TFILE",
310 //        "mmap " + Opts + " -N mmap_wu8k       -l 8k   -I 5000 -w      -f $VFILE",
311 //        "mmap " + Opts + " -N mmap_wu128k     -l 128k -I 500000 -w    -f $VFILE",
312         "mmap " + Opts + " -N mmap_wa8k -l 8k   -I 3000 -w      -f MAP_ANON",
313         "mmap " + Opts + " -N mmap_wa128k       -l 128k -I 50000 -w     -f MAP_ANON",
314
315         "munmap " + Opts + " -N unmap_z8k       -l 8k   -I 500          -f /dev/zero",
316         "munmap " + Opts + " -N unmap_z128k     -l 128k -I 500          -f /dev/zero",
317 //        "munmap " + Opts + " -N unmap_t8k     -l 8k   -I 500          -f $TFILE",
318 //        "munmap " + Opts + " -N unmap_t128k   -l 128k -I 500          -f $TFILE",
319 //        "munmap " + Opts + " -N unmap_u8k     -l 8k   -I 500          -f $VFILE",
320 //        "munmap " + Opts + " -N unmap_u128k   -l 128k -I 500          -f $VFILE",
321         "munmap " + Opts + " -N unmap_a8k       -l 8k   -I 500          -f MAP_ANON",
322         "munmap " + Opts + " -N unmap_a128k     -l 128k -I 500          -f MAP_ANON",
323
324         "munmap " + Opts + " -N unmap_rz8k      -l 8k   -I 1000 -r      -f /dev/zero",
325         "munmap " + Opts + " -N unmap_rz128k    -l 128k -I 2000 -r      -f /dev/zero",
326 //        "munmap " + Opts + " -N unmap_rt8k    -l 8k   -I 1000 -r      -f $TFILE",
327 //        "munmap " + Opts + " -N unmap_rt128k  -l 128k -I 3000 -r      -f $TFILE",
328 //        "munmap " + Opts + " -N unmap_ru8k    -l 8k   -I 1000 -r      -f $VFILE",
329 //        "munmap " + Opts + " -N unmap_ru128k  -l 128k -I 3000 -r      -f $VFILE",
330         "munmap " + Opts + " -N unmap_ra8k      -l 8k   -I 1000 -r      -f MAP_ANON",
331         "munmap " + Opts + " -N unmap_ra128k    -l 128k -I 2000 -r      -f MAP_ANON",
332
333 //        "connection " + Opts + " -N conn_connect              -B 256  -c",
334
335         "munmap " + Opts + " -N unmap_wz8k      -l 8k   -I 1000 -w      -f /dev/zero",
336         "munmap " + Opts + " -N unmap_wz128k    -l 128k -I 8000 -w      -f /dev/zero",
337 //        "munmap " + Opts + " -N unmap_wt8k    -l 8k   -I 1000 -w      -f $TFILE",
338 //        "munmap " + Opts + " -N unmap_wt128k  -l 128k -I 10000        -w      -f $TFILE",
339 //        "munmap " + Opts + " -N unmap_wu8k    -l 8k   -I 1000 -w      -f $VFILE",
340 //        "munmap " + Opts + " -N unmap_wu128k  -l 128k -I 50000        -w      -f $VFILE",
341         "munmap " + Opts + " -N unmap_wa8k      -l 8k   -I 1000 -w      -f MAP_ANON",
342         "munmap " + Opts + " -N unmap_wa128k    -l 128k -I 10000        -w      -f MAP_ANON",
343
344
345         "mprotect " + Opts + " -N mprot_z8k     -l 8k  -I 300                   -f /dev/zero",
346         "mprotect " + Opts + " -N mprot_z128k   -l 128k -I 500          -f /dev/zero",
347         "mprotect " + Opts + " -N mprot_wz8k    -l 8k   -I 500  -w      -f /dev/zero",
348         "mprotect " + Opts + " -N mprot_wz128k  -l 128k -I 1000 -w      -f /dev/zero",
349         "mprotect " + Opts + " -N mprot_twz8k  -l 8k   -I 1000 -w -t   -f /dev/zero",
350         "mprotect " + Opts + " -N mprot_tw128k -l 128k -I 2000 -w -t   -f /dev/zero",
351         "mprotect " + Opts + " -N mprot_tw4m   -l 4m   -w -t -B 1  -f /dev/zero",
352
353         "pipe " + Opts + " -N pipe_pst1 -s 1    -I 1000 -x pipe -m st",
354         "pipe " + Opts + " -N pipe_pmt1 -s 1    -I 8000 -x pipe -m mt",
355         "pipe " + Opts + " -N pipe_pmp1 -s 1    -I 8000 -x pipe -m mp",
356         "pipe " + Opts + " -N pipe_pst4k        -s 4k   -I 1000 -x pipe -m st",
357         "pipe " + Opts + " -N pipe_pmt4k        -s 4k   -I 8000 -x pipe -m mt",
358         "pipe " + Opts + " -N pipe_pmp4k        -s 4k   -I 8000 -x pipe -m mp",
359
360         "pipe " + Opts + " -N pipe_sst1 -s 1    -I 1000 -x sock -m st",
361         "pipe " + Opts + " -N pipe_smt1 -s 1    -I 8000 -x sock -m mt",
362         "pipe " + Opts + " -N pipe_smp1 -s 1    -I 8000 -x sock -m mp",
363         "pipe " + Opts + " -N pipe_sst4k        -s 4k   -I 1000 -x sock -m st",
364         "pipe " + Opts + " -N pipe_smt4k        -s 4k   -I 8000 -x sock -m mt",
365         "pipe " + Opts + " -N pipe_smp4k        -s 4k   -I 8000 -x sock -m mp",
366
367         "pipe " + Opts + " -N pipe_tst1 -s 1    -I 1000 -x tcp  -m st",
368         "pipe " + Opts + " -N pipe_tmt1 -s 1    -I 8000 -x tcp  -m mt",
369         "pipe " + Opts + " -N pipe_tmp1 -s 1    -I 8000 -x tcp  -m mp",
370         "pipe " + Opts + " -N pipe_tst4k        -s 4k   -I 1000 -x tcp  -m st",
371         "pipe " + Opts + " -N pipe_tmt4k        -s 4k   -I 8000 -x tcp  -m mt",
372         "pipe " + Opts + " -N pipe_tmp4k        -s 4k   -I 8000 -x tcp  -m mp",
373
374 //        "connection " + Opts + " -N conn_accept               -B 256      -a",
375
376         "close_tcp " + Opts + " -N close_tcp            -B 32  "
377
378     );
379
380     
381     @Override
382     protected String getTag() {
383         return "Native Micro";
384     };
385     @Override
386     protected String getPath() {
387         return "/system/bin/bench_";
388     }
389     protected final List<String> getCommands() {
390         return COMMANDS;
391     }
392
393     /*
394      * The unit is usecs/call
395      */
396     private double getBenchResult(String command) {
397         String stdOut = mStdOuts.get(command);
398         int index = stdOut.lastIndexOf("mean of 95%");
399         double value = 0.0;
400         try {
401             String summary = stdOut.substring(index, stdOut.length());
402             String[] substrings = summary.toString().split("\\s+");
403             value = Double.valueOf(substrings[3]);
404             return value;
405         }
406         catch (StringIndexOutOfBoundsException sioobe) {
407             Log.d(TAG, "StringIndexOutOfBoundsException");
408         }
409         catch (ArrayIndexOutOfBoundsException aioobe) {
410             Log.d(TAG, "ArrayIndexOutOfBoundsException");
411         }
412         catch (NumberFormatException nfe) {
413             Log.d(TAG, "NumberFormatException");
414         }
415         return ERROR_VALUE;
416     }
417
418     private String getCommandName(String command) {
419         if (command == null || command.equals(""))
420             return command;
421         String stdErr = mStdErrs.get(command);
422
423         try {
424             String[] substrings = stdErr.split("\\s+");
425             String commandName = substrings[1];
426             return commandName;
427         }
428         catch (Exception ex) {
429             String[] substrings = command.toString().split("\\s+");
430             return substrings[0];
431         }
432     }
433
434     @Override
435     protected boolean saveResult(Intent intent) {
436         Bundle bundle = new Bundle();
437         StringBuilder report = new StringBuilder();
438         for (String command: getCommands()) {
439             if(!mSockets.containsKey(command))
440                 continue;
441             String [] lines = mSockets.get(command).trim().split("\n");
442             String name = lines[0].trim().split("\t")[0];
443             if (name.equals("")) {
444                 report.append(getCommandName(command));
445             }
446             else {
447                 report.append(name);
448             }
449             StringBuilder list = new StringBuilder();;
450             for(String line: lines) {
451                 String [] sp = line.trim().split("\t");
452                 if (sp.length != 2) {
453                     Log.w(TAG, "error line: " + line.trim());
454                     continue;
455                 }
456                 if(!name.equals(sp[0]))
457                     Log.i(TAG, "Incompatible bench name in socket out: " + name + " v.s. " + sp[0]);
458                 try {
459                     int toInt = (int)Float.parseFloat(sp[1]);
460                     list.append(toInt + " ");
461                 } catch (Exception e) { // error format
462                     Log.e(TAG, "cannot parse '" + sp[1] + "' in line: " +  line);
463                     continue;
464                 }
465             }
466
467             if(!mStdOuts.containsKey(command)) {
468                 report.append("\n");
469                 continue;
470             }
471
472             double value = getBenchResult(command);
473             if (value == ERROR_VALUE) {
474                 report.append(" FAIL\n");
475             }
476             else {
477                 report.append(" " + value + " usecs/call\n");
478                 bundle.putString(command+"S", name);
479                 bundle.putString(command+"FA", list.toString().trim());
480             }
481         }
482         bundle.putString(REPORT, report.toString());
483         intent.putExtra(RESULT, bundle);
484         return true;
485     }
486 }