我想分享一些测试。
在这两种情况下,我都使用自定义分配器,因此我可以检查实际使用了多少内存。
但是我的自定义分配器不适用于向量,因此不计算内部向量内存(每条记录 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
使用 80 M 对进行测试:
2:08 与 6:17