受这个问题的启发。我创建了一个小型基准测试程序来比较原型、二进制格式和Json。NET。基准测试本身是一个基于https://github.com/sidshetye/SerializersCompare的小型控制台。随意添加/改进,向组合中添加一个新的序列化程序非常简单。无论如何,我的结果是:
Binary Formatter ProtoBuf Json.NET ServiceStackJson ServiceStackJSV
Loop Size:512 bytes Size:99 bytes Size:205 bytes Size:205 bytes Size:181 bytes
1 16.1242 ms 151.6354 ms 277.2085 ms 129.8321 ms 146.3547 ms
2 0.0673 ms 0.0349 ms 0.0727 ms 0.0343 ms 0.0370 ms
4 0.0292 ms 0.0085 ms 0.0303 ms 0.0145 ms 0.0148 ms
8 0.0255 ms 0.0069 ms 0.0017 ms 0.0216 ms 0.0129 ms
16 0.0011 ms 0.0064 ms 0.0282 ms 0.0114 ms 0.0120 ms
32 0.0164 ms 0.0061 ms 0.0334 ms 0.0112 ms 0.0120 ms
64 0.0347 ms 0.0073 ms 0.0296 ms 0.0121 ms 0.0013 ms
128 0.0312 ms 0.0058 ms 0.0266 ms 0.0062 ms 0.0117 ms
256 0.0256 ms 0.0097 ms 0.0448 ms 0.0087 ms 0.0116 ms
512 0.0261 ms 0.0058 ms 0.0307 ms 0.0127 ms 0.0116 ms
1024 0.0258 ms 0.0057 ms 0.0309 ms 0.0113 ms 0.0122 ms
2048 0.0257 ms 0.0059 ms 0.0297 ms 0.0125 ms 0.0121 ms
4096 0.0247 ms 0.0060 ms 0.0290 ms 0.0119 ms 0.0120 ms
8192 0.0247 ms 0.0060 ms 0.0286 ms 0.0115 ms 0.0121 ms
免责声明:
>
以上结果来自Windows虚拟机-与裸机操作系统相比,非常小间隔的秒表/计时器值可能不是100%准确。所以忽略上表中的超低值。
对于ServiceStack,Json和JSV得分来自两个单独的运行。由于它们共享相同的底层ServiceStack库,因此一个接一个地运行会影响下一次运行的“冷启动”1循环分数(“热启动”很快)
二进制格式是最大的大小,但也是最快的单个序列化=
问题#1:为什么对于单个序列化来说,原型Buf要慢得多=
问题#2:从实际的角度来看,我们能做些什么来克服“冷启动”?通过它运行至少一个对象(任何类型)?通过它运行每个(关键)对象类型?
问题#1:为什么对于单个序列化来说,原型Buf要慢得多=
因为它做了大量的工作来分析模型和准备策略;我花了很多时间使生成的策略尽可能快,但可能是我在元编程层的优化方面做得不够。我很乐意将其作为一个项目添加进来,以减少第一次通过的时间。当然,另一方面,元编程层的速度仍然是Json的两倍。NET的等效预处理;p
问题#2:从实际角度来看,我们能做些什么来克服“冷启动”?是否至少运行一个对象(任何时间)?是否运行每种(关键)对象类型?
各种选项:
>
在启动时显式地告诉模型“root”类型,并存储Compile()的输出
static TypeModel serializer;
...
RuntimeTypeModel.Default.Add(typeof(Foo), true);
RuntimeTypeModel.Default.Add(typeof(Bar), true);
serializer = RuntimeTypeModel.Default.Compile();
(Compile()方法将从根类型进行分析,同时添加所需的任何其他类型,并返回已编译生成的实例)
在启动时明确告诉模型“根”类型,并调用CompileInPlace()
“几次”;CompileInPlace()
不会完全扩展模型-但调用它几次应该涵盖了大多数基础,因为编译一层会将其他类型带入模型
RuntimeTypeModel.Default.Add(typeof(Foo), true);
RuntimeTypeModel.Default.Add(typeof(Bar), true);
for(int i = 0 ; i < 5 ; i++) {
RuntimeTypeModel.Default.CompileInPlace();
}
另外,我可能应该:
最后的想法:Compile
和CompileInPlace
之间的主要区别是如果您忘记添加某些类型会发生什么;CompileInPlace
适用于现有模型,因此您仍然可以稍后添加新类型(隐式或显式),并且它将“只是工作”;Compile
更严格:一旦您通过它生成了一个类型,它是固定的,并且只能处理它在编译时可以推断出的类型。
问题内容: 我正在使用Google BigQuery,并且正在从PHP执行一些简单的查询。(例如,从电子邮件中的SELECT * WHERE email='mail@test.com‘)我只是在检查表中是否存在该电子邮件。 表“电子邮件”目前为空。但是,PHP脚本仍然需要大约4分钟的时间来检查一个空表上的175封电子邮件。.如我希望将来该表将被填充,并且将有500 000封邮件,那么我想请求时间会
问题内容: (重要)编辑3: 单独运行testajax2.php而 _不是_Ajax。持续时间大致相同,为1.02-1.03秒。所以我想这意味着问题出在PHP- MySQL或XAMPP中? 当我通过phpMyAdmin查询运行它时,结果如下:显示第0-29行(总计约50行。查询用时 0.0015秒 )。看来问题根本不在于Ajax,而可能在于PHP。我怎样才能解决这个问题?(我也刚刚编辑了问题标题。
下面是所讨论的程序的摘录。矩阵的大小为size×size,并在以下位置初始化: 然后,创建一个矩阵,这里的每个字段都是img矩阵中围绕它的9个字段的平均值。为了简单起见,边框留在0。 这就是节目的全部内容。为了完整起见,下面是前面的内容。后面没有代码。正如您所看到的,这只是初始化。 基本上,当大小是2048的倍数时,该程序是缓慢的,例如执行次数: 编译器是gcc。据我所知,这是因为内存管理,但我对
使用xarray的open_mfdataset打开一系列大约90个netCDF文件,每个文件大约27MB,加载一个小的时空选择需要很长时间。 分块维度产生边际收益。decode_cf=True在函数内部或单独都没有区别。这里还有一个建议https://groups.google.com/forum/#!topic/xarray/11lDGSeza78让我将所选内容另存为一个单独的netCdf并重新
问题内容: 我有一个PostgreSQL函数,可以将查询结果返回到pgadmin结果网格中。在内部,这是一个简单的函数,使用a连接到另一个数据库并返回查询,以便我可以简单地运行 它的运行就像基本的表查询一样。 问题是当我使用该子句时。因此,我想运行以下查询,但它要花很多时间: 我怎样才能加快速度?有什么比这种情况下的子句快的吗? 问题答案: 不是表-可能是一些存储过程,因此查询并不是很简单。您需要
执行此操作后: 结果是:T0:5.971µs T1:26.69574ms 为什么第二个新的Arc::慢,如果我们克隆c0之前? 编辑: 我用以下方法测试了它: < li>Windows 10,rust 1.44.1调试版 < li>Linux,rust 1.47-夜间发行版 < li>Linux,rust 1.18 < li>MacOS,rust 1 . 44 . 0-夜间发布 T1的时间随向量大