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

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

mercurial