200 lines
6.5 KiB
C++
200 lines
6.5 KiB
C++
#include "qorderprocessor.h"
|
|
#include "OrderBookParser.h"
|
|
#include "ObjectPool.h"
|
|
#include <QCoreApplication>
|
|
#include <QDebug>
|
|
#include <QElapsedTimer>
|
|
|
|
/**
|
|
* @brief 优化测试类,用于验证性能提升
|
|
*/
|
|
class OptimizationTest {
|
|
public:
|
|
static void runTests() {
|
|
qDebug() << "=== QTradeProgram 优化测试 ===";
|
|
|
|
testObjectPool();
|
|
testOrderBookParser();
|
|
testQOrderProcessor();
|
|
|
|
qDebug() << "=== 优化测试完成 ===";
|
|
}
|
|
|
|
private:
|
|
static void testObjectPool() {
|
|
qDebug() << "\n1. 对象池测试:";
|
|
|
|
BigOrderInfoPool& pool = BigOrderInfoPool::instance();
|
|
qDebug() << "初始池大小:" << pool.poolSize();
|
|
|
|
QVector<QSharedPointer<BigOrderInfo>> objects;
|
|
QElapsedTimer timer;
|
|
timer.start();
|
|
|
|
// 测试对象池性能
|
|
for (int i = 0; i < 1000; ++i) {
|
|
auto obj = pool.acquire();
|
|
obj->code = QString("TEST%1").arg(i);
|
|
obj->volume = i * 100.0;
|
|
objects.append(obj);
|
|
}
|
|
|
|
qint64 elapsed = timer.elapsed();
|
|
qDebug() << "创建1000个对象耗时:" << elapsed << "ms";
|
|
qDebug() << "池大小:" << pool.poolSize();
|
|
qDebug() << "总创建对象数:" << pool.totalCreated();
|
|
|
|
// 释放对象回池
|
|
objects.clear();
|
|
qDebug() << "释放后池大小:" << pool.poolSize();
|
|
}
|
|
|
|
static void testOrderBookParser() {
|
|
qDebug() << "\n2. OrderBookParser 优化测试:";
|
|
|
|
OrderBookParser parser;
|
|
OrderBookData data;
|
|
|
|
// 模拟数据
|
|
Qot_UpdateOrderBook::Response response;
|
|
auto* s2c = response.mutable_s2c();
|
|
s2c->set_name("测试股票");
|
|
s2c->mutable_security()->set_code("000001");
|
|
s2c->set_svrrecvtimeask("2025-01-01 09:30:00");
|
|
s2c->set_svrrecvtimebid("2025-01-01 09:30:00");
|
|
|
|
// 添加买盘数据
|
|
for (int i = 0; i < 10; ++i) {
|
|
auto* bid = s2c->add_orderbookbidlist();
|
|
bid->set_price(10.0 + i * 0.1);
|
|
bid->set_volume(i * 1000.0);
|
|
bid->set_oredercount(1);
|
|
|
|
auto* detail = bid->add_detaillist();
|
|
detail->set_orderid(1000 + i);
|
|
detail->set_volume(i * 1000.0);
|
|
}
|
|
|
|
// 添加卖盘数据
|
|
for (int i = 0; i < 10; ++i) {
|
|
auto* ask = s2c->add_orderbookasklist();
|
|
ask->set_price(11.0 + i * 0.1);
|
|
ask->set_volume(i * 800.0);
|
|
ask->set_oredercount(1);
|
|
|
|
auto* detail = ask->add_detaillist();
|
|
detail->set_orderid(2000 + i);
|
|
detail->set_volume(i * 800.0);
|
|
}
|
|
|
|
QElapsedTimer timer;
|
|
timer.start();
|
|
|
|
std::string serialized = response.SerializeAsString();
|
|
bool success = parser.parse(serialized.c_str(), serialized.size(), data);
|
|
|
|
qint64 elapsed = timer.elapsed();
|
|
qDebug() << "解析耗时:" << elapsed << "ms";
|
|
qDebug() << "解析结果:" << (success ? "成功" : "失败");
|
|
qDebug() << "股票代码:" << data.code;
|
|
qDebug() << "买盘数量:" << data.bids.size();
|
|
qDebug() << "卖盘数量:" << data.asks.size();
|
|
}
|
|
|
|
static void testQOrderProcessor() {
|
|
qDebug() << "\n3. QOrderProcessor 优化测试:";
|
|
|
|
QOrderProcessor processor;
|
|
QMap<QString, float> thresholds;
|
|
thresholds["000001"] = 5000.0f; // 设置大单阈值
|
|
processor.setreplyCodeQuantity(thresholds);
|
|
|
|
// 创建测试数据
|
|
OrderBookData testData;
|
|
testData.code = "000001";
|
|
testData.name = "测试股票";
|
|
testData.askTime = "2025-01-01 09:30:00";
|
|
testData.bidTime = "2025-01-01 09:30:00";
|
|
|
|
// 添加大单测试数据
|
|
OrderBookEntry bigOrder;
|
|
bigOrder.price = 10.5;
|
|
bigOrder.volume = 10000.0;
|
|
bigOrder.orderCount = 1;
|
|
|
|
OrderDetail bigDetail;
|
|
bigDetail.orderId = 9999;
|
|
bigDetail.volume = 10000.0;
|
|
bigOrder.details.append(bigDetail);
|
|
|
|
testData.asks.append(bigOrder);
|
|
|
|
QElapsedTimer timer;
|
|
timer.start();
|
|
|
|
// 测试缓存性能
|
|
for (int i = 0; i < 100; ++i) {
|
|
auto result = processor.findExtremeOrders(testData);
|
|
if (i == 0) {
|
|
qDebug() << "首次检测到大单数量:" << result.size();
|
|
if (!result.isEmpty()) {
|
|
qDebug() << "大单信息 - 订单ID:" << result[0].orderId
|
|
<< "数量:" << result[0].volume;
|
|
}
|
|
}
|
|
}
|
|
|
|
qint64 elapsed = timer.elapsed();
|
|
qDebug() << "100次检测耗时:" << elapsed << "ms";
|
|
qDebug() << "缓存命中率:" << processor.getCacheHitRatio() * 100 << "%";
|
|
qDebug() << "缓存命中次数:" << processor.getCacheHitRate();
|
|
qDebug() << "缓存未命中次数:" << processor.getCacheMissRate();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @brief 性能监控演示
|
|
*/
|
|
void demonstrateMemoryMonitoring() {
|
|
qDebug() << "\n4. 内存监控演示:";
|
|
|
|
// 启用内存跟踪
|
|
#define MEMORY_TRACKING
|
|
#include "ObjectPool.h"
|
|
|
|
MemoryMonitor& monitor = MemoryMonitor::instance();
|
|
monitor.setMemoryThreshold(50 * 1024 * 1024); // 50MB阈值
|
|
|
|
// 模拟内存分配
|
|
TRACK_MEMORY_ALLOC(1024 * 1024, "OrderBookData"); // 1MB
|
|
TRACK_MEMORY_ALLOC(512 * 1024, "BigOrderInfo"); // 512KB
|
|
|
|
auto usage = monitor.getMemoryUsage();
|
|
qDebug() << "当前内存使用情况:";
|
|
for (auto it = usage.begin(); it != usage.end(); ++it) {
|
|
if (it.value() > 0) {
|
|
qDebug() << " " << it.key() << ":" << it.value() / 1024.0 << "KB";
|
|
}
|
|
}
|
|
qDebug() << "总内存使用:" << monitor.getTotalMemoryUsage() / (1024.0 * 1024.0) << "MB";
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
QCoreApplication app(argc, argv);
|
|
|
|
qDebug() << "开始执行优化测试...";
|
|
|
|
OptimizationTest::runTests();
|
|
demonstrateMemoryMonitoring();
|
|
|
|
qDebug() << "\n=== 所有测试完成 ===";
|
|
qDebug() << "优化总结:";
|
|
qDebug() << "- 对象池模式减少内存分配开销";
|
|
qDebug() << "- 数据预处理提高数据质量";
|
|
qDebug() << "- 缓存机制避免重复计算";
|
|
qDebug() << "- 并行处理提升处理速度";
|
|
qDebug() << "- 内存监控防止内存泄漏";
|
|
|
|
return 0;
|
|
}
|