我应该在我的Dart地图键中使用int/enum或String来最小化内存使用吗?

should I use an int/enum or String in my Dart map keys to minimise memory usage?

本文关键字:String 最小化 内存 enum int Dart 我的 地图 我应该      更新时间:2023-09-26

我的web应用程序在一个大的[Dart]地图中使用(并存储)数据。考虑到内存和效率/性能,我应该使用int或String作为键,理解int总是64位的?

举个简单的例子:

 Map one=new Map();
 one[1]=somedata;
 one[2]=somedata2;
 one[3]=somedata3;
 Map two=new Map();
 two['1']=somedata;
 two['2']=somedata2;
 two['3']=somedata3;
 Map big =new Map();

存储数百 1和2

一个['12345678']=x是否与一个[1]=x使用相同的内存量?

(如果存在sizeof(1),这将很容易测试!)

我应该被打扰吗?

感谢史蒂夫

数字占用的空间更小。SMI("小整数")范围内的数字(在32位机器上为31位,在64位机器上为63位)只占用一个单词。另一方面,字符串是指向表示字符串的对象的指针。也就是说,你使用的每个字符串都存在于堆的某个地方。如果您只有几个可能的字符串,并且重用这些字符串,那么字符串的开销就不会那么高。

整数对于哈希码和等式计算也更快。如果它不会降低代码的可读性,那么应该使用整数。否则,您应该评估性能和内存的改进是否真的值得牺牲可读性(或清晰度)。

注意:当编译成JavaScript时,事情变得更加复杂。Dart使用JavaScript对象作为容器。这意味着字符串是非常有效的。普通JavaScript对象经过优化,可以用作String映射(尽管负查找没有那么快)。它们处理数字的效率也很高,但是它们不存储插入顺序。这意味着,链接的hashmap(默认的Dart Map)不能仅仅使用JavaScript对象作为数字的容器。如果你想有一个有效的整数映射,也可以在JavaScript中工作(最多31位的值),你应该使用dart:collection中的HashMap

我猜一个['12345678']=x使用与一个[1]=x相同的内存量。因为像Java一样,Dart只在内存中保存字符串一次,所以字符串永远不会重复。所以我想你不需要为键操心了