bit1count.c

本文介绍了一个简单的C程序,用于计算输入的十进制整数转换为二进制后的1的个数。该程序使用位操作来逐位检查整数,并通过循环遍历所有位来实现这一目标。

bool db::AlarmLogDB::SearchLogsInfo(stAlarmLogsSearchResult &result, const stAlarmLogsSearchParams& params) { //产生1000条测试数据 //SelectAlarmLog(); //检查是否需清除一年前数据 DeleteOverTimeData(); result.Clear(); QString condition = "where "; bool bNeedCondition = false; if (ALARM_Max != params.eAlarmLevel) { //添加用户类型 condition = condition + "AlarmLevel = " + std::to_string(params.eAlarmLevel).c_str() + " "; bNeedCondition = true; } //时间条件 QString timeCondition = QString("DateTime >= %1 AND DateTime <= %2") .arg(params.sBeginTime.toMSecsSinceEpoch()) .arg(params.sEndTime.toMSecsSinceEpoch()); if (!bNeedCondition) { //全部查询 condition = "where " + timeCondition; } else { condition = condition + " AND " + timeCondition; } if (0 > params.iTotalPage) { //总数 QString sqlCount = QString::fromLocal8Bit("SELECT count(*) FROM %1 %2") .arg(g_TableName) .arg(condition); auto queryCount = DatabaseControl::GetInstall().Exec(sqlCount); if (queryCount.lastError().isValid()) { QString errText = queryCount.lastError().text(); LOG_WARN("SearchLogsInfo exec fail, sqlCount %s, error %s", sqlCount.toLocal8Bit().data(), errText.toLocal8Bit().data()); return false; } if (queryCount.next()) { result.iTotalCount = queryCount.value(0).toInt(); result.iTotalPage = (queryCount.value(0).toInt() + params.iEveryPageNum - 1) / params.iEveryPageNum; } if (result.iTotalCount <= 0) { LOG_WARN("SearchLogsInfo count[%d] ", result.iTotalCount); return false; } } { QString sqlSearch = QString::fromLocal8Bit("SELECT * FROM %1 %4 ORDER BY DateTime DESC LIMIT %2,%3 ") .arg(g_TableName) .arg((params.iCurPage - 1)*params.iEveryPageNum) .arg(params.iEveryPageNum) .arg(condition); auto query = DatabaseControl::GetInstall().Exec(sqlSearch); if (query.lastError().isValid()) { QString errText = query.lastError().text(); LOG_ERROR("%s exec fail, sqlInsert %s, error %s", __FUNCDNAME__, sqlSearch.toLocal8Bit().data(), errText.toLocal8Bit().data()); return false; } LOG_TRACE("%s exec succ, data count [%d] ", __FUNCDNAME__, query.size()); while (query.next()) { result.LogList.push_back( AlarmLog((AlarmLevel)query.value(1).toInt() , QDateTime::fromMSecsSinceEpoch(query.value(0).toDouble()) , query.value(2).toString()) ); } result.iCurPage = params.iCurPage; } return true; }
10-16
### `AlarmLogDB::SelectAlarmLog` 函数分析 #### 功能分析 `AlarmLogDB::SelectAlarmLog` 函数的主要功能是从数据库中查询所有的报警日志记录,并按照 `DateTime` 字段降序排列。如果查询结果记录数小于等于 1 条,会生成 1000 条测试数据插入到数据库中,然后重新执行查询。 #### 性能优化 - **避免使用 `goto` 语句**:使用 `goto` 语句会使代码的逻辑变得复杂,降低代码的可读性和可维护性。可以使用循环结构来替代 `goto` 语句。 ```cpp QList<AlarmLog> AlarmLogDB::SelectAlarmLog() { bool needRetry = true; while (needRetry) { QString select = QString("SELECT * FROM %1 ORDER BY DateTime DESC;").arg(g_TableName); auto query = DatabaseControl::GetInstall().Exec(select); if (query.lastError().isValid()) { QString errText = query.lastError().text(); LOG_ERROR("%s exec fail, sqlInsert %s, error %s", __FUNCDNAME__, select.toLocal8Bit().data(), errText.toLocal8Bit().data()); return QList<AlarmLog>(); } LOG_TRACE("%s exec succ", __FUNCDNAME__); QList<AlarmLog> alarmLogList; while (query.next()) { alarmLogList.push_back(AlarmLog((AlarmLevel)query.value(1).toInt(), QDateTime::fromMSecsSinceEpoch(query.value(0).toDouble()), query.value(2).toString())); } if (alarmLogList.size() > 1) { needRetry = false; } else { qint64 tTime = QDateTime::currentDateTime().toSecsSinceEpoch(); for (int idx = 0; idx < 1000; ++idx) { QDateTime time = QDateTime::fromSecsSinceEpoch(tTime - idx * 60 * 60 * 24); AlarmLog testLog((AlarmLevel)(idx % ALARM_Max), u8"测试数据_" + QString::number(idx)); testLog.sDateTime = time; InsertAlarmLog(testLog); } } } return QList<AlarmLog>(); } ``` - **批量插入测试数据**:在插入测试数据时,可以使用批量插入的方式,减少与数据库的交互次数,提高插入性能。 #### 错误处理优化 - **增加重试机制**:在执行查询或插入操作失败时,可以增加重试机制,避免因为临时的数据库连接问题或其他错误导致查询失败。 - **记录详细的错误信息**:除了记录 SQL 语句和错误信息,还可以记录数据库的状态、连接信息等,方便后续排查问题。 ### `db::AlarmLogDB::SearchLogsInfo` 函数分析 由于没有提供 `db::AlarmLogDB::SearchLogsInfo` 函数的具体代码,以下是一般性的分析和优化建议。 #### 功能分析 推测该函数的功能是根据特定的条件搜索报警日志信息。 #### 性能优化 - **索引优化**:在数据库表的搜索条件字段上创建索引,提高查询性能。 - **分页查询**:如果搜索结果可能非常大,可以使用分页查询的方式,每次只查询部分数据,减少内存开销。 #### 错误处理优化 - **异常捕获**:在函数中使用 `try-catch` 块捕获可能的异常,避免程序崩溃。 - **错误码返回**:函数返回一个错误码,方便调用者判断函数的执行结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值