anchor.diff:          | _ -> map
   
       [ "http"; "https" ]
  -    |> List.fold addProxy Map.empty 
  +    |> List.fold addProxy Map.empty
  +
  +let calcEnvProxies = lazy (envProxies())
  +
  +let private proxies = System.Collections.Concurrent.ConcurrentDictionary<_,_>()
   
   let getDefaultProxyFor url =
       let uri = new Uri(url)
  -    let getDefault () =
  -        let result = WebRequest.GetSystemWebProxy()
  -        let address = result.GetProxy(uri)
  -
  -        if address = uri then null else
  -        let proxy = new WebProxy(address)
  -        proxy.Credentials <- CredentialCache.DefaultCredentials
  -        proxy.BypassProxyOnLocal <- true
  +    let key = uri.Host,uri.Port,uri.Scheme
  +    match proxies.TryGetValue key with
  +    | true,proxy -> proxy
  +    | _ ->
  +        let getDefault () =
  +            let result = WebRequest.GetSystemWebProxy()
  +            let address = result.GetProxy(uri)
  +
  +            if address = uri then null else
  +            let proxy = new WebProxy(address)
  +            proxy.Credentials <- CredentialCache.DefaultCredentials
  +            proxy.BypassProxyOnLocal <- true
  +            proxy
  +
  +        let proxy =
  +            match calcEnvProxies.Force().TryFind uri.Scheme with
  +            | Some p -> if p.GetProxy(uri) <> uri then p else getDefault()
  +            | None -> getDefault()
  +        proxies.TryAdd(key,proxy) |> ignore
           proxy
  -
  -    match envProxies().TryFind uri.Scheme with
  -    | Some p -> if p.GetProxy(uri) <> uri then p else getDefault()
  -    | None -> getDefault()
   
   let inline createWebClient(url,auth:Auth option) =
       let client = new WebClient()
  
positive.code:     let getProxy (scheme:string) =
          let envVarName = sprintf "%s_PROXY" (scheme.ToUpperInvariant())
          let envVarValue = getEnvValue envVarName
          if envVarValue = null then 
              None 
          else
              match Uri.TryCreate(envVarValue, UriKind.Absolute) with
  
negative.code:     let getEnvValue (name:string) =
          let v = Environment.GetEnvironmentVariable(name.ToUpperInvariant())
          // under mono, env vars are case sensitive
          if isNull v then Environment.GetEnvironmentVariable(name.ToLowerInvariant()) else v
      let bypassList =
          let noproxy = getEnvValue "NO_PROXY"
          if String.IsNullOrEmpty(noproxy) then [||] else
  