1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/TestPerf.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,253 @@ 1.4 +#include "TestCommon.h" 1.5 +#include <stdio.h> 1.6 +#include "nsCRT.h" /* should be "plstr.h"? */ 1.7 +#include "nsNetUtil.h" 1.8 +#include "nsIServiceManager.h" 1.9 +#include "nsIComponentRegistrar.h" 1.10 +#include "nsISupportsArray.h" 1.11 +#include <algorithm> 1.12 + 1.13 +namespace TestPerf { 1.14 + 1.15 +static nsIIOService *gIOService = nullptr; 1.16 + 1.17 +//----------------------------------------------------------------------------- 1.18 + 1.19 +static bool 1.20 +load_sync_1(nsISupports *element, void *data) 1.21 +{ 1.22 + nsCOMPtr<nsIInputStream> stream; 1.23 + nsCOMPtr<nsIURI> uri( do_QueryInterface(element) ); 1.24 + nsAutoCString spec; 1.25 + nsresult rv; 1.26 + 1.27 + rv = NS_OpenURI(getter_AddRefs(stream), uri, gIOService); 1.28 + if (NS_FAILED(rv)) { 1.29 + uri->GetAsciiSpec(spec); 1.30 + fprintf(stderr, "*** failed opening %s [rv=%x]\n", spec.get(), rv); 1.31 + return true; 1.32 + } 1.33 + 1.34 + char buf[4096]; 1.35 + uint32_t bytesRead; 1.36 + 1.37 + while (1) { 1.38 + rv = stream->Read(buf, sizeof(buf), &bytesRead); 1.39 + if (NS_FAILED(rv) || bytesRead == 0) { 1.40 + if (NS_FAILED(rv)) { 1.41 + uri->GetAsciiSpec(spec); 1.42 + fprintf(stderr, "*** failed reading %s [rv=%x]\n", spec.get(), rv); 1.43 + } 1.44 + break; 1.45 + } 1.46 + } 1.47 + 1.48 + return true; 1.49 +} 1.50 + 1.51 +static nsresult 1.52 +load_sync(nsISupportsArray *urls) 1.53 +{ 1.54 + urls->EnumerateForwards(load_sync_1, nullptr); 1.55 + return NS_OK; 1.56 +} 1.57 + 1.58 +//----------------------------------------------------------------------------- 1.59 + 1.60 +static int gRequestCount = 0; 1.61 + 1.62 +class MyListener : public nsIStreamListener 1.63 +{ 1.64 +public: 1.65 + NS_DECL_ISUPPORTS 1.66 + NS_DECL_NSIREQUESTOBSERVER 1.67 + NS_DECL_NSISTREAMLISTENER 1.68 + 1.69 + MyListener() { } 1.70 + virtual ~MyListener() {} 1.71 +}; 1.72 + 1.73 +NS_IMPL_ISUPPORTS(MyListener, nsIStreamListener, nsIRequestObserver) 1.74 + 1.75 +NS_IMETHODIMP 1.76 +MyListener::OnStartRequest(nsIRequest *req, nsISupports *ctx) 1.77 +{ 1.78 + return NS_OK; 1.79 +} 1.80 + 1.81 +NS_IMETHODIMP 1.82 +MyListener::OnDataAvailable(nsIRequest *req, nsISupports *ctx, 1.83 + nsIInputStream *stream, 1.84 + uint64_t offset, uint32_t count) 1.85 +{ 1.86 + nsresult rv; 1.87 + char buf[4096]; 1.88 + uint32_t n, bytesRead; 1.89 + while (count) { 1.90 + n = std::min<uint32_t>(count, sizeof(buf)); 1.91 + rv = stream->Read(buf, n, &bytesRead); 1.92 + if (NS_FAILED(rv)) 1.93 + break; 1.94 + count -= bytesRead; 1.95 + if (bytesRead == 0) 1.96 + break; 1.97 + } 1.98 + return NS_OK; 1.99 +} 1.100 + 1.101 +NS_IMETHODIMP 1.102 +MyListener::OnStopRequest(nsIRequest *req, nsISupports *ctx, nsresult status) 1.103 +{ 1.104 + if (NS_FAILED(status)) { 1.105 + nsAutoCString spec; 1.106 + req->GetName(spec); 1.107 + fprintf(stderr, "*** failed loading %s [reason=%x]\n", spec.get(), status); 1.108 + } 1.109 + if (--gRequestCount == 0) { 1.110 + // post shutdown event 1.111 + QuitPumpingEvents(); 1.112 + } 1.113 + return NS_OK; 1.114 +} 1.115 + 1.116 +static bool 1.117 +load_async_1(nsISupports *element, void *data) 1.118 +{ 1.119 + nsCOMPtr<nsIURI> uri( do_QueryInterface(element) ); 1.120 + if (!uri) 1.121 + return true; 1.122 + 1.123 + MyListener *listener = new MyListener(); 1.124 + if (!listener) 1.125 + return true; 1.126 + NS_ADDREF(listener); 1.127 + nsresult rv = NS_OpenURI(listener, nullptr, uri, gIOService); 1.128 + NS_RELEASE(listener); 1.129 + if (NS_SUCCEEDED(rv)) 1.130 + gRequestCount++; 1.131 + else 1.132 + printf(">> NS_OpenURI failed [rv=%x]\n", rv); 1.133 + return true; 1.134 +} 1.135 + 1.136 +static nsresult 1.137 +load_async(nsISupportsArray *urls) 1.138 +{ 1.139 + urls->EnumerateForwards(load_async_1, nullptr); 1.140 + 1.141 + PumpEvents(); 1.142 + return NS_OK; 1.143 +} 1.144 + 1.145 +//----------------------------------------------------------------------------- 1.146 + 1.147 +static nsresult 1.148 +read_file(const char *fname, nsISupportsArray *urls) 1.149 +{ 1.150 + FILE *fp = fopen(fname, "r"); 1.151 + if (!fp) { 1.152 + printf("failed opening file: %s\n", fname); 1.153 + return NS_ERROR_FAILURE; 1.154 + } 1.155 + 1.156 + nsCOMPtr<nsIURI> uri; 1.157 + nsresult rv; 1.158 + char buf[512]; 1.159 + while (fgets(buf, sizeof(buf), fp)) { 1.160 + // remove trailing newline 1.161 + buf[strlen(buf) - 1] = 0; 1.162 + rv = NS_NewURI(getter_AddRefs(uri), buf, nullptr, gIOService); 1.163 + if (NS_FAILED(rv)) 1.164 + printf("*** ignoring malformed uri: %s\n", buf); 1.165 + else { 1.166 + //nsXPIDLCString spec; 1.167 + //uri->GetSpec(getter_Copies(spec)); 1.168 + //printf("read url: %s\n", spec.get()); 1.169 + urls->AppendElement(uri); 1.170 + } 1.171 + } 1.172 + 1.173 + fclose(fp); 1.174 + return NS_OK; 1.175 +} 1.176 + 1.177 +//----------------------------------------------------------------------------- 1.178 + 1.179 +static void 1.180 +print_usage() 1.181 +{ 1.182 + printf("usage: TestPerf [-sync|-async] <file-of-urls>\n"); 1.183 +} 1.184 + 1.185 +} // namespace 1.186 + 1.187 +using namespace TestPerf; 1.188 + 1.189 +int 1.190 +main(int argc, char **argv) 1.191 +{ 1.192 + if (test_common_init(&argc, &argv) != 0) 1.193 + return -1; 1.194 + 1.195 + nsresult rv; 1.196 + bool sync; 1.197 + 1.198 + if (argc < 3) { 1.199 + print_usage(); 1.200 + return -1; 1.201 + } 1.202 + 1.203 + if (PL_strcasecmp(argv[1], "-sync") == 0) 1.204 + sync = true; 1.205 + else if (PL_strcasecmp(argv[1], "-async") == 0) 1.206 + sync = false; 1.207 + else { 1.208 + print_usage(); 1.209 + return -1; 1.210 + } 1.211 + 1.212 + nsCOMPtr<nsIServiceManager> servMan; 1.213 + NS_InitXPCOM2(getter_AddRefs(servMan), nullptr, nullptr); 1.214 + nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan); 1.215 + NS_ASSERTION(registrar, "Null nsIComponentRegistrar"); 1.216 + registrar->AutoRegister(nullptr); 1.217 + 1.218 + // cache the io service 1.219 + { 1.220 + nsCOMPtr<nsIIOService> ioserv( do_GetIOService() ); 1.221 + NS_ADDREF(gIOService = ioserv); 1.222 + } 1.223 + 1.224 + nsCOMPtr<nsISupportsArray> urls; 1.225 + rv = NS_NewISupportsArray(getter_AddRefs(urls)); 1.226 + if (NS_FAILED(rv)) return -1; 1.227 + 1.228 + rv = read_file(argv[2], urls); 1.229 + if (NS_FAILED(rv)) { 1.230 + printf("failed reading file-of-urls\n"); 1.231 + return -1; 1.232 + } 1.233 + 1.234 + uint32_t urlCount; 1.235 + urls->Count(&urlCount); 1.236 + 1.237 + PRIntervalTime start = PR_IntervalNow(); 1.238 + 1.239 + if (sync) 1.240 + rv = load_sync(urls); 1.241 + else 1.242 + rv = load_async(urls); 1.243 + 1.244 + if (NS_FAILED(rv)) { 1.245 + printf("load failed\n"); 1.246 + return -1; 1.247 + } 1.248 + 1.249 + PRIntervalTime end = PR_IntervalNow(); 1.250 + fprintf(stderr, "read: %u urls; total time: %u milliseconds\n", 1.251 + urlCount, 1.252 + PR_IntervalToMilliseconds(end - start)); 1.253 + 1.254 + NS_RELEASE(gIOService); 1.255 + return 0; 1.256 +}