Performance 如何提高Dart的二进制数据转换性能?

Performance 如何提高Dart的二进制数据转换性能?,performance,dart,data-conversion,Performance,Dart,Data Conversion,在为一家更大的德国公司Future Technologies Group做咨询工作时,我向Dart移植了大约6000行Java服务器端软件。这将有助于回答Dart能否在服务器上有效使用的问题。(这本身就为Dart开了绿灯,因为它有一种语言用于客户端和服务器端编程的优势。) 了解Dart(我非常喜欢使用Dart)后,我预计相对于Java,性能会下降30-50%,但无论如何都不会低于100%(速度是Java的两倍),这是上述决策过程的截止点 港口进展顺利。我学到了很多。单元测试很好。但是演出结果非常

在为一家更大的德国公司Future Technologies Group做咨询工作时,我向Dart移植了大约6000行Java服务器端软件。这将有助于回答Dart能否在服务器上有效使用的问题。(这本身就为Dart开了绿灯,因为它有一种语言用于客户端和服务器端编程的优势。)

了解Dart(我非常喜欢使用Dart)后,我预计相对于Java,性能会下降30-50%,但无论如何都不会低于100%(速度是Java的两倍),这是上述决策过程的截止点

港口进展顺利。我学到了很多。单元测试很好。但是演出结果非常糟糕。。。与Java程序相比,总体速度要慢七倍

分析代码发现了两个主要问题:数据转换和文件I/O。也许我做错了什么?在我回到我的客户那里,他们取消了Dart研究之前,我想寻求一些关于如何改进的建议。让我们从数据转换开始,将本机Dart数据类型转换为各种二进制格式,可用于有效传输和存储数据

通常,这些转换非常简单和快速,因为实际上不需要从使用的内部格式转换任何内容,而大部分内容都存储在缓冲区中。我创建了一个基准程序,以某种方式反映了这些转换在我的程序中的典型使用:

导入'dart:typed_data';
导入“包:基准线束/基准线束.dart”;
//通过扩展BenchmarkBase创建新基准
类转换基准扩展了BenchmarkBase{
UINT8列表结果;
ConversionBenchmark():超级(“转换”);
//基准代码。
无效运行(){
常量int BufSize=262144;//256KB
const int SetSize=64;//重复一组“典型”数据
ByteData缓冲区=新的ByteData(BufSize);
double doubleContent=0.0;//用于模拟双内容
int intContent=0;//用于模拟int内容
整数偏移=0;
对于(int j=0;j
它基于来自的基准线束。为了进行比较,我使用了以下基于Dart基准测试线束端口的Java程序:

包ylib.tools;
导入java.nio.ByteBuffer;
公共类转换基准扩展了BenchmarkBase{
公共ByteBuffer结果;
公共转换基准({super(“转换”);}
//基准代码。
@覆盖受保护的无效运行(){
final int BufSize=262144;//256KB
final int SetSize=64;//重复一组“典型”数据
ByteBuffer缓冲区=ByteBuffer.allocate(BufSize);
double doubleContent=0.0;//用于模拟双内容
int intContent=0;//用于模拟int内容
对于(int j=0;j<(buffer.capacity()/SetSize);j++){
//以下是一些“典型”转换组合:
buffer.putdoull(doubleContent);doubleContent+=0.123;
对于(intk=0;k<8;k++){//主要用例
buffer.putFloat((float)doubleContent);doubleContent+=0.123;
}
putInt(intContent);intContent++;
putInt(intContent);intContent++;
putShort((short)intContent);intContent++;
putShort((short)intContent);intContent++;
put((字节)intContent);intContent++;
put((字节)intContent);intContent++;
buffer.put(“AsciiStrng.getBytes());
//assert((buffer.position()%SetSize)==0);//确保示例内容适合[SetSize]字节
}
buffer.flip();//需要进一步处理
result=buffer;//避免编译器优化所有内容
}
公共静态void main(字符串[]args){
新的转换基准().report();
}
}
Java代码的运行速度几乎是我的英特尔Windows 7计算机上Dart代码的10倍。两者都在各自的虚拟机上以生产模式运行


代码中有明显的错误吗?或者有不同的飞镖类可以做这项工作?关于为什么Dart在这些简单的转换中会慢得多,有什么解释吗?还是我对Dart VM性能的期望完全错误?

字节数据方法(
ByteData.setXYZ
ByteData.getXYZ
)在Dart VM上的性能确实比直接类型数组访问差得多。我们开始研究这个问题,初步结果令人鼓舞[1]

同时,您可以通过使用类型化数组(完整代码见[2])将自己的转换转换为big-endian,从而解决这一令人遗憾的性能回归问题:

///Writer包装固定大小的Uint8L