netwerk/test/TestCachePerformance.js

Wed, 31 Dec 2014 06:55:46 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:46 +0100
changeset 1
ca08bd8f51b2
permissions
-rw-r--r--

Added tag TORBROWSER_REPLICA for changeset 6474c204b198

michael@0 1 var DEBUG = true;
michael@0 2
michael@0 3 var clientID = "javascript";
michael@0 4 var nsICache = Components.interfaces.nsICache;
michael@0 5
michael@0 6 function getCacheService()
michael@0 7 {
michael@0 8 var nsCacheService = Components.classes["@mozilla.org/network/cache-service;1"];
michael@0 9 var service = nsCacheService.getService(Components.interfaces.nsICacheService);
michael@0 10 return service;
michael@0 11 }
michael@0 12
michael@0 13 function createCacheSession(clientID, storagePolicy, streamable)
michael@0 14 {
michael@0 15 var service = getCacheService();
michael@0 16 var session = service.createSession(clientID, storagePolicy, streamable);
michael@0 17 return session;
michael@0 18 }
michael@0 19
michael@0 20 function openCacheEntry(url, mode)
michael@0 21 {
michael@0 22 var session = createCacheSession(clientID, nsICache.STORE_ON_DISK, true);
michael@0 23 var entry = session.openCacheEntry(url, mode);
michael@0 24 return entry;
michael@0 25 }
michael@0 26
michael@0 27 function wrapInputStream(input)
michael@0 28 {
michael@0 29 var nsIScriptableInputStream = Components.interfaces.nsIScriptableInputStream;
michael@0 30 var factory = Components.classes["@mozilla.org/scriptableinputstream;1"];
michael@0 31 var wrapper = factory.createInstance(nsIScriptableInputStream);
michael@0 32 wrapper.init(input);
michael@0 33 return wrapper;
michael@0 34 }
michael@0 35
michael@0 36 function getIOService()
michael@0 37 {
michael@0 38 var CID = Components.classes["@mozilla.org/network/io-service;1"];
michael@0 39 var service = CID.getService(Components.interfaces.nsIIOService);
michael@0 40 return service;
michael@0 41 }
michael@0 42
michael@0 43 function downloadHTTP(spec)
michael@0 44 {
michael@0 45 var ioService = getIOService();
michael@0 46 var uri = ioService.newURI(spec, null, null);
michael@0 47 var channel = ioService.newChannelFromURI(uri);
michael@0 48 var input = wrapInputStream(channel.open());
michael@0 49 var data = input.read(input.available());
michael@0 50 input.close();
michael@0 51 return data;
michael@0 52 }
michael@0 53
michael@0 54 function download(url)
michael@0 55 {
michael@0 56 var data = "";
michael@0 57 var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 65536);
michael@0 58 var stream = url.getContent();
michael@0 59 while (true) {
michael@0 60 var count = stream.read(buffer);
michael@0 61 if (count <= 0)
michael@0 62 break;
michael@0 63 var str = new java.lang.String(buffer, 0, count);
michael@0 64 data += str;
michael@0 65 }
michael@0 66 stream.close();
michael@0 67 return data;
michael@0 68 }
michael@0 69
michael@0 70 function write(url, data)
michael@0 71 {
michael@0 72 var key = url.toString();
michael@0 73 var outputEntry = openCacheEntry(key, nsICache.ACCESS_WRITE);
michael@0 74 var output = outputEntry.transport.openOutputStream(0, -1, 0);
michael@0 75 var count = output.write(data, data.length);
michael@0 76
michael@0 77 // store some metadata.
michael@0 78 outputEntry.setMetaDataElement("size", data.length);
michael@0 79
michael@0 80 output.close();
michael@0 81 outputEntry.markValid();
michael@0 82 outputEntry.close();
michael@0 83
michael@0 84 return count;
michael@0 85 }
michael@0 86
michael@0 87 function read(url)
michael@0 88 {
michael@0 89 var key = url.toString();
michael@0 90 var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ);
michael@0 91 var input = wrapInputStream(inputEntry.transport.openInputStream(0, -1, 0));
michael@0 92 var data = input.read(input.available());
michael@0 93 input.close();
michael@0 94 inputEntry.close();
michael@0 95 return data;
michael@0 96 }
michael@0 97
michael@0 98 function readMetaData(url, element)
michael@0 99 {
michael@0 100 var key = url.toString();
michael@0 101 var inputEntry = openCacheEntry(key, nsICache.ACCESS_READ);
michael@0 102 var metadata = inputEntry.getMetaDataElement(element);
michael@0 103 inputEntry.close();
michael@0 104 return metadata;
michael@0 105 }
michael@0 106
michael@0 107 function doom(url)
michael@0 108 {
michael@0 109 var key = url.toString();
michael@0 110 var doomedEntry = openCacheEntry(key, nsICache.ACCESS_READ_WRITE);
michael@0 111 doomedEntry.doom();
michael@0 112 doomedEntry.close();
michael@0 113 }
michael@0 114
michael@0 115 function test()
michael@0 116 {
michael@0 117 // download some real content from the network.
michael@0 118 var url = new java.net.URL("http://www.mozilla.org");
michael@0 119 var key = url.toString();
michael@0 120 var data = download(url);
michael@0 121
michael@0 122 if (write(url, data) == data.length)
michael@0 123 print("disk cache write works!");
michael@0 124 else
michael@0 125 print("disk cache write broken!");
michael@0 126
michael@0 127 if (read(url) == data)
michael@0 128 print("disk cache read works!");
michael@0 129 else
michael@0 130 print("disk cache read broken!");
michael@0 131
michael@0 132 if (readMetaData(url, "size") == data.length)
michael@0 133 print("disk cache metadata works!");
michael@0 134 else
michael@0 135 print("disk cache metadata broken!");
michael@0 136 }
michael@0 137
michael@0 138 function median(array)
michael@0 139 {
michael@0 140 var cmp = function(x, y) { return x - y; }
michael@0 141 array.sort(cmp);
michael@0 142 var middle = Math.floor(array.length / 2);
michael@0 143 return array[middle];
michael@0 144 }
michael@0 145
michael@0 146 function sum(array)
michael@0 147 {
michael@0 148 var s = 0;
michael@0 149 var len = array.length;
michael@0 150 for (var i = 0; i < len; ++i)
michael@0 151 s += array[i];
michael@0 152 return s;
michael@0 153 }
michael@0 154
michael@0 155 function time()
michael@0 156 {
michael@0 157 var N = 50;
michael@0 158 var System = java.lang.System;
michael@0 159 var url = new java.net.URL("http://www.mozilla.org");
michael@0 160 var downloadTimes = new Array();
michael@0 161 for (var i = 0; i < N; ++i) {
michael@0 162 var begin = System.currentTimeMillis();
michael@0 163 download(url);
michael@0 164 var end = System.currentTimeMillis();
michael@0 165 downloadTimes.push(end - begin);
michael@0 166 }
michael@0 167 var downloadTotal = sum(downloadTimes);
michael@0 168 var downloadMean = downloadTotal / N;
michael@0 169 var downloadMedian = median(downloadTimes);
michael@0 170 print("" + N + " downloads took " + downloadTotal + " milliseconds.");
michael@0 171 print("mean = " + downloadMean + " milliseconds.");
michael@0 172 print("median = " + downloadMedian + " milliseconds.");
michael@0 173
michael@0 174 var readTimes = new Array();
michael@0 175 for (var i = 0; i < N; ++i) {
michael@0 176 var begin = System.currentTimeMillis();
michael@0 177 read(url);
michael@0 178 var end = System.currentTimeMillis();
michael@0 179 readTimes.push(end - begin);
michael@0 180 }
michael@0 181 var readTotal = sum(readTimes);
michael@0 182 var readMean = readTotal / N;
michael@0 183 var readMedian = median(readTimes);
michael@0 184 print("" + N + " reads took " + readTotal + " milliseconds.");
michael@0 185 print("mean = " + readMean + " milliseconds.");
michael@0 186 print("median = " + readMedian + " milliseconds.");
michael@0 187 }
michael@0 188
michael@0 189 // load the cache service before doing anything with Java...
michael@0 190 getCacheService();
michael@0 191
michael@0 192 if (DEBUG) {
michael@0 193 print("cache service loaded.");
michael@0 194 } else {
michael@0 195 print("running disk cache test.");
michael@0 196 test();
michael@0 197 print("disk cache test complete.");
michael@0 198 }

mercurial