Cut down memory usage for tables in XORFastHash by factor of four
`pow(2, 16)` is not `2 << 16` but rather `1 << 16`. With this change we cut memory usage in half for the XORFastHash's two tables. Adapts XORFastHashStorage, memory usage reduction by factor two.
This commit is contained in:
		
							parent
							
								
									60ef6070b0
								
							
						
					
					
						commit
						1417d43430
					
				| @ -37,8 +37,8 @@ namespace util | |||||||
| */ | */ | ||||||
| class XORFastHash | class XORFastHash | ||||||
| { // 65k entries
 | { // 65k entries
 | ||||||
|     std::array<std::uint16_t, (2u << 16u)> table1; |     std::array<std::uint16_t, (1u << 16u)> table1; | ||||||
|     std::array<std::uint16_t, (2u << 16u)> table2; |     std::array<std::uint16_t, (1u << 16u)> table2; | ||||||
| 
 | 
 | ||||||
|   public: |   public: | ||||||
|     XORFastHash() |     XORFastHash() | ||||||
|  | |||||||
| @ -34,29 +34,35 @@ template <typename NodeID, typename Key> class XORFastHashStorage | |||||||
| 
 | 
 | ||||||
|     XORFastHashStorage() = delete; |     XORFastHashStorage() = delete; | ||||||
| 
 | 
 | ||||||
|     explicit XORFastHashStorage(size_t) : positions(2 << 16), current_timestamp(0) {} |     explicit XORFastHashStorage(size_t) : positions(1u << 16u), current_timestamp(0) {} | ||||||
| 
 | 
 | ||||||
|     HashCell &operator[](const NodeID node) |     HashCell &operator[](const NodeID node) | ||||||
|     { |     { | ||||||
|         unsigned short position = fast_hasher(node); |         std::uint16_t position = fast_hasher(node); | ||||||
|         while ((positions[position].time == current_timestamp) && (positions[position].id != node)) |         while ((positions[position].time == current_timestamp) && (positions[position].id != node)) | ||||||
|         { |         { | ||||||
|             ++position %= (2 << 16); |             ++position %= (1u << 16u); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         positions[position].time = current_timestamp; |         positions[position].time = current_timestamp; | ||||||
|         positions[position].id = node; |         positions[position].id = node; | ||||||
|  | 
 | ||||||
|  |         BOOST_ASSERT(position < positions.size()); | ||||||
|  | 
 | ||||||
|         return positions[position]; |         return positions[position]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // peek into table, get key for node, think of it as a read-only operator[]
 |     // peek into table, get key for node, think of it as a read-only operator[]
 | ||||||
|     Key peek_index(const NodeID node) const |     Key peek_index(const NodeID node) const | ||||||
|     { |     { | ||||||
|         unsigned short position = fast_hasher(node); |         std::uint16_t position = fast_hasher(node); | ||||||
|         while ((positions[position].time == current_timestamp) && (positions[position].id != node)) |         while ((positions[position].time == current_timestamp) && (positions[position].id != node)) | ||||||
|         { |         { | ||||||
|             ++position %= (2 << 16); |             ++position %= (1u << 16u); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         BOOST_ASSERT(position < positions.size()); | ||||||
|  | 
 | ||||||
|         return positions[position].key; |         return positions[position].key; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -66,7 +72,7 @@ template <typename NodeID, typename Key> class XORFastHashStorage | |||||||
|         if (std::numeric_limits<unsigned>::max() == current_timestamp) |         if (std::numeric_limits<unsigned>::max() == current_timestamp) | ||||||
|         { |         { | ||||||
|             positions.clear(); |             positions.clear(); | ||||||
|             positions.resize(2 << 16); |             positions.resize(1u << 16u); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user