针对 Float32List 优化 Dart Builder.writeListFloat32()

作者: bjornm创建于 2026年1月29日更新于 2026年9月17日
标签staledartpr-requested

Dart平缓 缓冲构建器在写出大型Float32Lists时速度很慢,因为它将元素一个接一个地排列,而不是复制了基础内存缓冲. 当给定的列表是"Float32List"时,该方法可以被优化为特例,然后使用更快的内存复制操作. 这符合使用已输入数据用于 cpu 高效代码的意图 。 建议更改的代码为:

达特 int 写入列表Float32( 列表 值) { profile( ! inVTable) ; (中文(简体) ). prepare ( size of Float32, 1 + 值. long); 最终结果= 尾; var 尾巴 = 尾巴; setUint32AtTail(尾部,值.长度); 尾- = 尺寸Uint32; 为(以数值计的最后值){ setFloat32AtTail(尾,值); 尾- = 大小(Float32); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回结果; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


改为:

达特
int 写入列表Float32( 列表 <double> 值) {
profile( ! inVTable) ; (中文(简体) ).
 prepare ( size of Float32, 1 + 值. long);
最终结果= 尾;
var 尾巴 =  尾巴;
 setUint32AtTail(尾部,值.长度);
尾- = 尺寸Uint32;

如果(值为 Float32List == endian.host = endian. little) {
// 快速复制 Float32 列表
/ 从 Float32List (零复制视图) 获取基本字节
最终浮点数Bytes = 值.buffer.asUint8List(值.offset InBytes,值.word InBytes;).

// 获得我们缓冲器中的目标位置
最终目标Offset =  buf.长 InBytes - 尾;

// 大量复制浮点字节直接到缓冲器
最终目标Bytes =  buf.buffer.asUint8List ( buf.offset InBytes;).
a. 目标Bytes. set Range(目标Offset,目标Offset + 浮点Bytes.长,浮点Bytes);

尾-=活体Bytes.长;
否则
// 非浮点32 列表,一次排列一个元素
为(以数值计的最后值){
 setFloat32AtTail(尾,值);
尾- = 大小(Float32);
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

返回结果;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

如果有道理的话 我很乐意分享公关 谢谢!

内容来源: google/flatbuffers