我想分享一些测试。
在两种情况下,我都使用了自定义分配器,因此我可以检查实际使用了多少内存。
但是我的自定义分配器无法与vector一起使用,因此不计算内部vector内存(每个记录8字节),同时分配也传递给标准分配器(
operator new
/
malloc
)。
我没有预留向量的空间,因为我不知道会有多少记录。
结论
Vector更快,使用的内存远远少于其他方式!
使用类STL的跳表标准实现- 比std::map
慢4-5%,但使用的内存要少得多。
Processed 9940000 records. In memory 9940000 records, 310162322 bytes. Allocator 663018328 bytes.
Processed 9950000 records. In memory 9950000 records, 310477634 bytes. Allocator 663688048 bytes.
Processed 9960000 records. In memory 9960000 records, 310793005 bytes. Allocator 664357320 bytes.
Processed 9970000 records. In memory 9970000 records, 311108063 bytes. Allocator 665025016 bytes.
Processed 9980000 records. In memory 9980000 records, 311422710 bytes. Allocator 665694536 bytes.
Processed 9990000 records. In memory 9990000 records, 311738268 bytes. Allocator 666363680 bytes.
Processed 10000000 records. In memory 9999999 records, 312054428 bytes. Allocator 667035168 bytes.
Flushing data... List record(s): 9999999 List size: 312054428
real 0m35.379s
user 0m34.218s
sys 0m1.072s
请注意,对于312'054'428字节的真实数据,实际上使用了近两倍的空间 - 667'035'168字节。
向量实现 - std::vector
、std::sort
、std::unique
:
Processed 9890000 records. In memory 9890000 records, 308578515 bytes. Allocator 343196258 bytes.
Processed 9900000 records. In memory 9900000 records, 308895613 bytes. Allocator 343548385 bytes.
Processed 9910000 records. In memory 9910000 records, 309213506 bytes. Allocator 343901119 bytes.
Processed 9920000 records. In memory 9920000 records, 309531058 bytes. Allocator 344253602 bytes.
Processed 9930000 records. In memory 9930000 records, 309848406 bytes. Allocator 344605762 bytes.
Processed 9940000 records. In memory 9940000 records, 310162322 bytes. Allocator 344954565 bytes.
Processed 9950000 records. In memory 9950000 records, 310477634 bytes. Allocator 345304978 bytes.
Processed 9960000 records. In memory 9960000 records, 310793005 bytes. Allocator 345655307 bytes.
Processed 9970000 records. In memory 9970000 records, 311108063 bytes. Allocator 346005229 bytes.
Processed 9980000 records. In memory 9980000 records, 311422710 bytes. Allocator 346355138 bytes.
Processed 9990000 records. In memory 9990000 records, 311738268 bytes. Allocator 346705788 bytes.
Processed 10000000 records. In memory 9999999 records, 312054428 bytes. Allocator 347057202 bytes.
Flushing data... List record(s): 9999999 List size: 312054428
real 0m12.759s
user 0m11.929s
sys 0m0.791s
测试 80M 对:
2:08 对比 6:17