关于是否要做什么,目前的情况如何
Transfer-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
或者a
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
当我想允许具有有限带宽的客户端表示他们愿意接受压缩响应并且服务器具有最终决定是否压缩时.
后者就是例如Apache的mod_deflate和IIS,如果你让它来处理压缩.根据要压缩的内容的大小,它将执行额外的操作Transfer-Encoding: chunked
.
它还将包括一个Vary: Accept-Encoding
已经暗示该问题的方法.Content-Encoding
似乎是实体的一部分,因此将Content-Encoding
金额更改为实体的更改,即不同的Accept-Encoding
标头意味着例如缓存不能使用其相同实体的缓存版本.
有没有一个明确的答案,我已经错过了(并没有埋没在某个apache新闻组的长线程中的消息中)?
我目前的印象是:
ETag
在透明地压缩响应时应该怎么做?)所以我假设正确的方式将是一个Transfer-Encoding: gzip
(或者,如果我另外大块的身体,它将成为 Transfer-Encoding: gzip, chunked
).并且没有理由在这种情况下触摸Vary
或ETag
任何其他标题,因为它是传输级别的东西.
现在我不太关心"逐跳"的问题Transfer-Encoding
,其他人似乎首先关注的是,因为代理可能会解压缩并向客户端转发未压缩的东西.但是,如果原始请求具有正确的Accept-Encoding
标头,则代理可能也可以原样转发(压缩),如果所有浏览器都知道给定的话.
顺便说一句,这个问题至少有十年之久,请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=68517.
任何有关这方面的澄清将不胜感激.无论是在符合标准的还是被认为是实用的方面.例如,仅支持透明"内容编码"的HTTP客户端库将成为反对实用性的论据.
我对很多文件进行了更改,与此同时我认为我宁愿将这个未经测试的代码提交给尚未创建的分支,这样现有代码库的用户就不会受到影响.
当我触及很多很多文件并创建和添加新的子项目等时,我想避免手动复制文件和文件夹.
在Visual Studio中完成此操作的最简单方法是什么?
HttpClient
有一个内置超时功能(尽管都是异步的,即超时可以被认为是与http请求功能正交,因此可以由通用异步实用程序处理,但是除此之外)当超时启动时,它会抛出一个TaskCanceledException
(包含在内) a AggregateException
).
TCE包含CancellationToken
等于的CancellationToken.None
.
现在,如果我提供HttpClient
了CancellationToken
我自己的一个并使用它来取消操作完成(或超时),我得到完全相同TaskCanceledException
,再次使用CancellationToken.None
.
通过仅查看抛出的异常,还有一种方法可以确定超时是否取消了请求,而不必让我自己CancellationToken
可以访问检查异常的代码?
PS这可能是一个错误,并CancellationToken
以某种方式错误地修复CancellationToken.None
?在取消使用自定义CancellationToken的情况下,我希望TaskCanceledException.CancellationToken
等于该自定义令牌.
编辑
为了使问题更加清晰,通过访问原始文件CancellationTokenSource
,很容易区分超时和用户取消:
origCancellationTokenSource.IsCancellationRequested == true
CancellationToken
从异常中获取但是给出了错误的答案:
((TaskCanceledException)e.InnerException).CancellationToken.IsCancellationRequested == false
这是一个最小的例子,由于受欢迎的需求:
public void foo()
{
makeRequest().ContinueWith(task =>
{
try
{
var result = task.Result;
// do something with the result;
}
catch (Exception e)
{
TaskCanceledException innerException = e.InnerException as TaskCanceledException;
bool …
Run Code Online (Sandbox Code Playgroud) 我正在研究如何确定我们未来产品的解决方案,我无法真正理解这一点.
有一堆AMQP 0.9.1实现(RabbitMQ,Apache Qpid,OpenAMQ,仅举几例),但没有AMQP 1.0实现,尽管1.0已经在2011年10月完成.好吧,除了SwiftMQ [1].
阅读1.0,它似乎与1.0之前的规范有很大的不同,所以似乎可以理解的是,对一些工作正常的重大改写几乎没什么热情.事实上,我不明白为什么RabbitMQ和其他人不会决定迁移到ZeroMQ而不是AMQP 1.0.
尽管如此,除了一些模糊的承诺,例如"努力始终实施最新的AMQP规范"之外,我还没有找到任何关于1.0 AMQP前规范的实施者的明确声明.
编辑: RabbitMQ确实说
然而,有些东西告诉我,声明已超过3年,即它早于AMQP 1.0的发布.
那么有没有迹象表明AMQP 1.0可能成为一个标准,除了主要银行 - 和微软 - 支持它的事实?顺便说一句.没有自己的实现.
看起来AMQP 0.9.1似乎比1.0更标准.
嗯,有https://github.com/rabbitmq/rabbitmq-amqp1.0,它自称的状态是原型,显然没有工作半年.
[1]我对SwiftMQ的第一印象是我通过其作者对Spring缺乏AMQP支持的咆哮得到的,这就是为什么我暂时不考虑它.我不想指望那个家伙的支持.
我想在node.js中使用.net dlls.这是否意味着我需要使用'clr hosting',一个la来使用c/c ++制作这些dll
不幸的是,在github上创建一个nodejs native .Net扩展的例子有点令人失望,只需向下滚动到最后一步
将"公共语言运行时支持"选项更改为"无公共语言运行时支持"
而且你知道我的意思.更正做到这一点的文章正义:它建议更改选项设置为"无公共语言运行库支持" 只为文件SharpAddon.cpp
添加将CLR支持启用(对于CLR项目的默认值),那么其他的.cpp-文件,这意味着事实上你可以从其他.cpp文件中使用.net dll.
这个问题实际上是在Node.js/serverside javascript中使用.NET DLL的重复,它是在甚至没有本地Windows节点端口的时候编写的,所以时间可能已经改变,尽管谷歌让我怀疑它.
谁か确认上记これらのフ
得到这样的东西
? - kanji
? - kana
? - kanji
? - kanji
? - kanji
? - kanji
? - kana
? - kana
? - kana
? - kana
? - kana
Run Code Online (Sandbox Code Playgroud)
(对不起,如果我做错了.)
分析一个WCF客户端应用程序(我没有写,还是不知道太多),其通过SOAP和运行一两天就会抛出一个OutOfMemoryException后谈了一堆的服务,我发现.NET的PooledBufferManager会永远不会释放未使用的缓冲区,即使应用程序内存不足,也会导致OOME.
这当然符合规范:http://msdn.microsoft.com/en-us/library/ms405814.aspx
当垃圾收集回收缓冲池时,池及其缓冲区被销毁.
请随意回答下面的一个问题,因为我有一堆问题,一些更一般的问题,以及一些特定于我们的应用程序使用BufferManager.
首先是关于(默认的Pooled)BufferManager的一些一般性问题:
1)在我们有GC的环境中,为什么我们需要一个可以保留未使用内存的BufferManager,即使它导致OOME?我知道,有BufferManager.Clear(),您可以使用它来手动删除所有缓冲区 - 如果您有权访问BufferManager,即.进一步了解为什么我似乎无法访问.
2)尽管MS声称"这个过程比每次需要使用一个缓冲区创建和销毁缓冲区要快得多.",它们不应该把它留给GC(例如它的LOH)并优化GC而不是?
3)当做一个BufferManager.Take(33*1024*1024)时,我会得到一个64M的缓冲区,因为PooledBufferManager将缓存该缓冲区以供以后重用,这可能 - 好吧,在我的情况下它不是,因此它是纯粹浪费记忆 - 比如34M,或50M,或64M,是需要的.因此创建一个可能非常浪费的BufferManager是明智的,HttpsChannelFactory使用(默认情况下,我假设)?我没有看到内存分配的性能如何重要,特别是当我们讨论WCF和网络服务时,应用程序将每隔10秒TOPS,通常多秒甚至几分钟.
现在有一些更具体的问题与我们的应用程序使用BufferManagers有关.该应用程序连接到几个不同的WCF服务.对于它们中的每一个,我们为http连接维护一个连接池,因为连接可能同时发生.
检查一个堆转储中的单个最大对象,一个64M字节数组,在初始化时只在我们的应用程序中使用过一次,之后不再需要,因为来自服务的响应仅在初始化时很大,即btw.对于我使用过的许多应用程序来说都是典型的,即使这可能会受到优化(缓存到磁盘等).WinDbg中的GC根分析产生以下结果(我将我们的专有类的名称清理为'MyServiceX'等):
0:000:x86> !gcroot -nostacks 193e1000
DOMAIN(00B8CCD0):HANDLE(Pinned):4d1330:Root:0e5b9c50(System.Object[])->
035064f0(MyServiceManager)->
0382191c(MyHttpConnectionPool`1[[MyServiceX, MyLib]])->
03821988(System.Collections.Generic.Queue`1[[MyServiceX, MyLib]])->
038219a8(System.Object[])->
039c05b4(System.Runtime.Remoting.Proxies.__TransparentProxy)->
039c0578(System.ServiceModel.Channels.ServiceChannelProxy)->
039c0494(System.ServiceModel.Channels.ServiceChannel)->
039bee30(System.ServiceModel.Channels.ServiceChannelFactory+ServiceChannelFactoryOverRequest)->
039beea4(System.ServiceModel.Channels.HttpsChannelFactory)->
039bf2c0(System.ServiceModel.Channels.BufferManager+PooledBufferManager)->
039c02f4(System.Object[])->
039bff24(System.ServiceModel.Channels.BufferManager+PooledBufferManager+BufferPool)->
039bff44(System.ServiceModel.SynchronizedPool`1[[System.Byte[], mscorlib]])->
039bffa0(System.ServiceModel.SynchronizedPool`1+GlobalPool[[System.Byte[], mscorlib]])->
039bffb0(System.Collections.Generic.Stack`1[[System.Byte[], mscorlib]])->
12bda2bc(System.Byte[][])->
193e1000(System.Byte[])
Run Code Online (Sandbox Code Playgroud)
查看由BufferManager管理的其他字节数组的gc根表明其他服务(不是'MyServiceX')具有不同的BufferPool实例,因此每个实例都在浪费自己的内存,它们甚至不共享浪费.
4)我们在这里做错了吗?我不是任何WCF专家,所以我们可以使各种HttpsChannelFactory实例都使用相同的BufferManager吗?
5)或者甚至更好,我们是否可以告诉所有HttpsChannelFactory实例根本不使用BufferManagers并要求GC完成它的神秘工作,即"管理内存"?
6)如果问题4)和5)不能回答,我能获得所有HttpsChannelFactory实例的BufferManager并对其手动调用.Clear() -这是从最优解远,但它会帮助已经,就我而言,它不仅可以在一个服务实例中释放前提的64M,而且还可以释放64M + 32M + 16M + 8M + 4M + 2M!因此,单独这样可以使我的应用程序持续更长时间而不会遇到内存问题(不,除了BufferManager之外,我们没有内存泄漏问题,尽管我们确实消耗了大量内存并在课程中累积了大量数据很多天,但这不是问题)
Test1
Test2
虽然我总是用一个0
参数调用方法,但是下面的内容始终快10%,所以切换案例中的内容 - 唯一的区别 - 永远不会被执行.
在将代码复制并粘贴到一个全新的项目中之后,仅将测试函数的名称更改为Main
,结果是相反的.每次我运行该项目,Test2
都会更快.
那么使这个更慢更快的因素是什么? 并且:我可以故意在.net中影响性能吗?
这些方法当然几乎没有做任何事情,因此对于主要涉及相同虚拟方法调用的测试(其中,CLR无法内联 - 对于Sun在bVM中实现它的开头语来说)的性能差异似乎很大.
NB这实际上是一个真实程序的最小版本,其中多个嵌套的switch语句导致巨大的性能差异不仅仅是10%,而是100%甚至更多,显然是由于嵌套交换机分支内部的代码存在,测试永远不会进入 (因此,这个最小版本可能会忽略可能涉及的实际程序的其他一些方面,但它确实会复制显着且一致的性能差异)
编辑在真实的程序中,可能比这个问题中的现象更重要的是,switch语句中的实际case语句是否适合通过分支表实现- (这取决于案例值中的空白 - 我是可以通过查看生成的IL代码来验证这一点)
测试运行
代码:
using System;
using System.Diagnostics;
class Test1 : ITest
{
public int Test(int a)
{
switch (a)
{
case 1: return a + a + a == 1234 ? 1 : 2;
case 2: return 2;
}
return 0;
}
}
class Test2 : ITest …
Run Code Online (Sandbox Code Playgroud) 如果我想立即添加大量项目Dictionary
并且我事先知道(粗略)数字,如果我使用适当的构造函数重载设置初始容量,则在内存和cpu方面更快更有效.
在我测试的情况下,使用300.000个条目,如果我将Dictionary的容量设置为300.000,它比未初始化时快约25%.
现在如果我有一个已经构建的,清空的词典,我需要填充大量的项目,我该怎么办?假设这是一个readonly
我无法用新的Dictionary实例重新分配的变量.我没有看到任何影响文档中已构造的Dictionary的容量的内容.像一个像一个东西Clear(int newInitialCapacity)
会很好.
我运气不好吗?
这是针对代码路径的一些微基准测试,每个纳秒需要遍历数十亿次,并且需要快速.
对于下面的代码段,进行比较
x.EndsWith(y, InvariantCulture)
Regex(y, Compiled | CultureInvariant).IsMatch(x)
我得到以下数字:
=============================
Regex : 00:00:01.2235890. Ignore this: 16666666
EndsWith: 00:00:03.2194626. Ignore this: 16666666
=============================
Regex : 00:00:01.0979105. Ignore this: 16666666
EndsWith: 00:00:03.2346031. Ignore this: 16666666
=============================
Regex : 00:00:01.0687845. Ignore this: 16666666
EndsWith: 00:00:03.3199213. Ignore this: 16666666
Run Code Online (Sandbox Code Playgroud)
换句话说,EndsWith
需要3倍的时间Regex
.
我应该注意,我尝试了其他值,并根据使用的字符串值,有时EndsWith
更快,有时Regex
是.
EndsWith(x, InvariantCulture)
归结为一些参数检查然后.(正如@nhahtdh正确指出的那样,在extern int nativeCompareOrdinalEx(String, int, String, int, int)
,我希望它会很快InvariantCulture
它调用的情况下CultureInfo.InvariantCulture.CompareInfo.IsSuffix which calls InternalFindNLSStringEx
.我不小心跟踪了这Ordinal
条路径)
注意:我刚刚发现,当用EndsWith …