性能优化实例:chia项目(1)

本文介绍了针对Chia Network的chiapos项目的性能优化实践,包括将数据类型从uint8_t更改为uint64_t以减少循环次数,优化统计二进制1的函数以利用空间换时间,以及改进SortToMemory函数以实现异步读取、减少拷贝开销、使用桶排序和引入线程池,这些改变能显著提高程序性能。
摘要由CSDN通过智能技术生成

chiapos是一个github上的项目,想了解它具体的内容可以自行了解,地址: https://github.com/Chia-Network/chiapos。
当前版本号为:e5830b182d155f8599426a7374306445cd7c0418,是截至到2021年6月7日的最新版本。
我们先打开其中一个文件,可以看到,这是一个排序的模块,主要功能是从磁盘读取一定长度的数据,然后通过插入法进行排序。
在这里插入图片描述

我们需要优化的重点在于以下标注的几个点:
在这里插入图片描述
1和2将uint8_t改成uint64_8,这样就能折叠循环次数。
在这里插入图片描述
在这里插入图片描述
优化后的代码如下:

inline static bool IsPositionEmpty(const uint8_t *memory, uint32_t const entry_len)
{
   
	for (uint32_t i = 0; i < entry_len; i++){
   
		if(entry_len - i >= 8){
   
			uint64_t *a1 = (uint64_t*)memory;
			if(*a1 == 0){
   
				i += 7;
				continue;
			}
			return false;
		}
		if(entry_len - i >= 4){
   
			uint32_t *a2 = (uint32_t*)memory;
			if(*a2 == 0){
   
				i += 3;
				continue;
			}
			return false;
		}
		if(entry_len - i >= 2){
   
			uint16_t *a3 = (uint16_t*)memory;
			if(*a3 == 0){
   
				i += 1;
				continue;
			}
			return false;
		}
		if (memory[i] != 0){
   
			return false;
		}
	}
	return true;
}

inline int MemCmpBits(
    uint8_t *left_arr,
    uint8_t *right_arr,
    uint32_t len,
    uint32_t bits_begin)
{
   
    uint32_t start_byte = bits_begin / 8;
    uint8_t mask = ((1 << (8 - (bits_begin % 8))) - 1);
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值