Subversion Repositories Applications.papyrus

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2150 mathias 1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2
  "http://www.w3.org/TR/html4/strict.dtd">
3
<html>
4
  <head>
5
    <title>Perf Tests</title>
6
    <script type="text/javascript" src="../../../dojo/dojo.js" djConfig="isDebug:true"></script>
7
    <script type="text/javascript" src="lipsum.js"></script>
8
    <script type="text/javascript">
9
    dojo.addOnLoad(function(){
10
      dojo.byId("run").disabled="";
11
      dojo.connect(dojo.byId("run"),
12
                   "onclick",
13
                   function(evt) {
14
                     setTimeout(function() {
15
                       var words = parseInt(dojo.byId("numWords").value) || 10;
16
                       var iters = parseInt(dojo.byId("numIters").value) || 1000;
17
                       buildAndRunSet(words, iters);
18
                      }, 0);
19
                    });
20
    });
21
 
22
    function element(tag, textOrChild) {
23
      var e = document.createElement(tag);
24
      if(dojo.isArray(textOrChild)) dojo.forEach(textOrChild, function(c) { e.appendChild(c); });
25
      if(dojo.isString(textOrChild)) e.appendChild(document.createTextNode(textOrChild));
26
      else e.appendChild(textOrChild);
27
      return e;
28
    }
29
 
30
    function log(t) {
31
      dojo.byId("mess").innerHTML = t;
32
    }
33
 
34
    function reportRun(results){
35
      var runs = results.runs
36
      var report = element("dl",
37
                     element("dt",
38
                             "Run with " + results.words + " words, " +
39
                                           results.iterations + " iterations and overhead of " +
40
                                           results.overhead));
41
 
42
      runs.sort(function(a,b) { return a.time - b.time; });
43
      dojo.forEach(runs, function(r) {
44
        report.appendChild(element("dd", r.time + " - " + r.name));
45
      });
46
 
47
      dojo.body().appendChild(report);
48
    }
49
 
50
    function runTest(test, iterations, expected) {
51
      var i;
52
      if(expected != test()) throw new Error("Test failed expecting " + expected + ", got " + test());
53
      var start = new Date().getTime(), end;
54
      for(i=0; i < iterations; i++){
55
        test();
56
      }
57
      end = new Date().getTime();
58
      return end-start;
59
    }
60
 
61
    function runSet(set, iterations){
62
 
63
      var tests = set.tests.concat(); //copy tests
64
      var resultSet = {};
65
      resultSet.words = set.words.length;
66
      resultSet.overhead = runTest(function(){}, iterations);
67
      resultSet.iterations = iterations;
68
      var runs = [];
69
 
70
      function _run() {
71
        var t = tests.pop();
72
        try {
73
          log("Running " + t.name);
74
          if(t) runs.push({ name: t.name, time: runTest(t.test, iterations, set.expected)});
75
        } catch(e) {
76
          console.error("Error running " + t.name);
77
          console.error(e);
78
        }
79
        if(tests.length > 0) {
80
          setTimeout(_run, 0);
81
        }
82
        else {
83
          log("Done!");
84
          resultSet.runs = runs;
85
          reportRun(resultSet);
86
        }
87
      }
88
      setTimeout(_run, 0);
89
    }
90
 
91
    function buildTestSet(numWords) {
92
      var words = [], i, wordsInLipsum = lipsum.length;
93
      for(i = numWords; i > 0; i-=wordsInLipsum) {
94
        if(i >= wordsInLipsum) { words = words.concat(lipsum); }
95
        else { words = words.concat(lipsum.slice(-i)); }
96
      }
97
      if(words.length != numWords) throw new Error("wrong number of words, got " + words.length + ", expected " + numWords);
98
 
99
      var expected = words.join("");
100
 
101
      //console.log(words);
102
 
103
      return {
104
        tests: [
105
          {
106
            name: "dojoForEach",
107
            test: function() {
108
              var s = "";
109
              dojo.forEach(words, function(w) { s+=w; });
110
              return s;
111
            }
112
          },
113
          {
114
            name: "nativeForEach",
115
            test: function() {
116
              var s = "";
117
              words.forEach(function(w) { s += w; });
118
              return s;
119
            }
120
          },
121
          {
122
            name: "forLoop",
123
            test: function() {
124
              var s="",w=words; l=w.length;
125
              for(var i = 0; i < l; i++) {
126
                s += w[i];
127
              }
128
              return s;
129
            }
130
          },
131
          {
132
            name: "forLoopCallingInlineFunction",
133
            test: function() {
134
              var s="",w=words; l=w.length;
135
              function fn(w) { s += w; };
136
              for(var i = 0; i < l; i++) {
137
                fn(w[i]);
138
              }
139
              return s;
140
            }
141
          },
142
          {
143
            name: "forLoopCallingExternalFunction",
144
            test: function() {
145
              g_s="",w=words; l=w.length;
146
              for(var i = 0; i < l; i++) {
147
                externalAppend(w[i]);
148
              }
149
              return g_s;
150
            }
151
          },
152
          {
153
            name: "forLoopWithInCheck",
154
            test: function() {
155
              var s="",w=words; l=w.length;
156
              for(var i = 0; i < l; i++) {
157
                if(i in w) s += w[i];
158
              }
159
              return s;
160
            }
161
          },
162
          {
163
            name: "emptyFor",
164
            test: function() {
165
              var w = words; l = w.length;
166
              for(var i = 0; i < l; i++) empty(w[i]);
167
              return expected;
168
            }
169
          },
170
          {
171
            name: "emptyForEach",
172
            test: function() {
173
              dojo.forEach(words, empty);
174
              return expected;
175
            }
176
          } ,
177
          {
178
            name: "identFor",
179
            test: function() {
180
              var w = words; l = w.length;
181
              for(var i = 0; i < l; i++) ident(w[i]);
182
              return expected;
183
            }
184
          },
185
          {
186
            name: "identForEach",
187
            test: function() {
188
              dojo.forEach(words, ident);
189
              return expected;
190
            }
191
          },
192
          {
193
            name: "addUsingFor",
194
            test: function() {
195
              var x=0;
196
              for(var i=0;i<1000;i++){x=x+a[i];}
197
              return expected; // fake
198
            }
199
          },
200
          {
201
            name: "addUsingForEach",
202
            test: function() {
203
              var x=0;
204
              dojo.forEach(a, function(v,i){x=x+a[i];});
205
              return expected; // fake
206
            }
207
          }
208
        ],
209
        words: words,
210
        expected: expected
211
      };
212
    }
213
 
214
    function buildAndRunSet(words, times) {
215
      runSet(buildTestSet(words), times);
216
    }
217
 
218
    function ident(w) { return w; }
219
    function empty() { }
220
 
221
    var g_s = "";
222
    function externalAppend(w){ g_s += w; }
223
 
224
    var a = new Array(1000);
225
    for(var i=0; i<1000;i++){a[i]=i;}
226
 
227
    </script>
228
    <style type="text/css">
229
    html {
230
      font-family: Lucida Grande, Tahoma;
231
    }
232
    div { margin-bottom: 1em; }
233
    #results {
234
      border: 1px solid #999;
235
      border-collapse: collapse;
236
    }
237
    #results caption {
238
      font-size: medium;
239
      font-weight: bold;
240
    }
241
    #results td, #results th {
242
      text-align: right;
243
      width: 10em;
244
      font-size: small;
245
      white-space: nowrap;
246
    }
247
    #wordsCol { background: yellow; }
248
    td.max { color: red; font-weight: bold; }
249
    td.min { color: green; font-weight: bold; }
250
    </style>
251
  </head>
252
  <body>
253
    <table>
254
      <tr><td><label for="numWords">Words</label></td><td><input type="text" id="numWords" value="100"/></td></tr>
255
      <tr><td><label for="numIters">Iterations</label></td><td><input type="text" id="numIters" value="1000"/></td></tr>
256
      <tr><td></td><td><button id="run" disabled>Run Tests!</button></td></tr>
257
    </table>
258
    <div id="mess"></div>
259
  </body>
260
</html>