With some prompting and suggestions from Mario Roy, author of MCE, I’ve been optimizing Hash::Ordered. With the exception of setting existing/new elements, which got a bit slower due to ensuring keys are strings, not references, most functions got faster. Some, like large hash deletion, are now MUCH faster.
Here are changes in benchmarks from version 0.002 to 0.009:
$VERSION 0.002 0.009
Results for ordered hash creation for 10 elements
94121/s 101293/s
Results for ordered hash creation for 100 elements
10931/s 11226/s
Results for ordered hash creation for 1000 elements
1022/s 1160/s
Results for fetching ~10% of 10 elements
1417712/s 1844781/s
Results for fetching ~10% of 100 elements
244800/s 285983/s
Results for fetching ~10% of 1000 elements
24871/s 30342/s
Results for replacing ~10% of 10 elements
1353795/s 1378880/s
Results for replacing ~10% of 100 elements
197232/s 192769/s
Results for replacing ~10% of 1000 elements
20364/s 19909/s
Results for adding 10 elements to empty hash
367588/s 341022/s
Results for adding 100 elements to empty hash
66495/s 58519/s
Results for adding 1000 elements to empty hash
7217/s 6497/s
Results for creating 10 element hash then deleting ~10%
95284/s 94598/s
Results for creating 100 element hash then deleting ~10%
6924/s 9242/s
Results for creating 1000 element hash then deleting ~10%
144/s 934/s
Results for listing pairs of 10 element hash
170187/s 178288/s
Results for listing pairs of 100 element hash
18839/s 19537/s
Results for listing pairs of 1000 element hash
1877/s 1959/s
You can see Hash::Ordered benchmarked against other modules in Hash::Ordered::Benchmarks.
If you need an ordered hash, I encourage you to try Hash::Ordered.