123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 |
- import { describe, it, expect, beforeEach, afterEach } from '@jest/globals'
- import { performance } from 'perf_hooks'
- import { DeltaNeutralController } from '../../src/controllers/DeltaNeutralController.js'
- import { AccountManager } from '../../src/modules/account/AccountManager.js'
- import { HedgeExecutionService } from '../../src/services/HedgeExecutionService.js'
- import { RiskMonitoringService } from '../../src/services/RiskMonitoringService.js'
- /**
- * 控制循环延迟性能测试
- * 验证 8 秒控制循环延迟要求 (T043)
- * 验证 10 秒故障转移 SLA 要求 (T044)
- */
- describe('Control Loop Latency Performance Tests', () => {
- let controller: DeltaNeutralController
- let mockAccountManager: jest.Mocked<AccountManager>
- let mockHedgeService: jest.Mocked<HedgeExecutionService>
- let mockRiskService: jest.Mocked<RiskMonitoringService>
- beforeEach(() => {
- // 创建快速响应的模拟服务
- mockAccountManager = {
- getAccounts: jest.fn().mockReturnValue(new Map([
- ['account-1', { netPosition: 0.5, unrealizedPnl: 100 }],
- ['account-2', { netPosition: -0.3, unrealizedPnl: -50 }],
- ['account-3', { netPosition: 0.2, unrealizedPnl: 25 }]
- ])),
- getAccountState: jest.fn().mockResolvedValue({ netPosition: 0.1, unrealizedPnl: 10 }),
- updateAccountState: jest.fn().mockResolvedValue(undefined),
- } as any
- mockHedgeService = {
- executeHedge: jest.fn().mockImplementation(async () => {
- // 模拟实际执行时间 (100-500ms)
- await new Promise(resolve => setTimeout(resolve, Math.random() * 400 + 100))
- return {
- success: true,
- executedOrders: [
- { accountId: 'account-1', symbol: 'BTC-USD', amount: 0.2, side: 'sell' }
- ],
- totalCost: 1000,
- executionTime: 150,
- netDeltaChange: -0.2
- }
- }),
- getStatus: jest.fn().mockReturnValue('running'),
- } as any
- mockRiskService = {
- getRiskMetrics: jest.fn().mockImplementation(async () => {
- // 模拟风险评估时间 (50-200ms)
- await new Promise(resolve => setTimeout(resolve, Math.random() * 150 + 50))
- return {
- accountId: 'test-account',
- deltaDeviation: 0.5,
- utilizationRate: 0.7,
- leverageRatio: 2,
- unrealizedPnl: 100,
- maxDrawdown: 200,
- timestamp: Date.now()
- }
- }),
- updateAccountRisk: jest.fn().mockResolvedValue(undefined),
- getActiveAlerts: jest.fn().mockReturnValue([]),
- getStatus: jest.fn().mockReturnValue('running'),
- } as any
- controller = new DeltaNeutralController(
- mockAccountManager,
- mockHedgeService,
- mockRiskService
- )
- })
- afterEach(async () => {
- await controller.stop()
- })
- describe('8-Second Control Loop Latency (T043)', () => {
- beforeEach(async () => {
- await controller.start()
- })
- it('should complete delta control within 8 seconds - single account', async () => {
- const startTime = performance.now()
- const request = {
- targetDelta: 0.0,
- accounts: ['account-1'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- }
- const response = await controller.executeDeltaControl(request)
- const endTime = performance.now()
- const executionTime = endTime - startTime
- expect(response.success).toBe(true)
- expect(executionTime).toBeLessThan(8000) // 8秒要求
- console.log(`Delta控制执行时间 (单账户): ${executionTime.toFixed(2)}ms`)
- })
- it('should complete delta control within 8 seconds - multiple accounts', async () => {
- const startTime = performance.now()
- const request = {
- targetDelta: 0.0,
- accounts: ['account-1', 'account-2', 'account-3'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- }
- const response = await controller.executeDeltaControl(request)
- const endTime = performance.now()
- const executionTime = endTime - startTime
- expect(response.success).toBe(true)
- expect(executionTime).toBeLessThan(8000) // 8秒要求
- console.log(`Delta控制执行时间 (多账户): ${executionTime.toFixed(2)}ms`)
- })
- it('should complete utilization rebalancing within 8 seconds', async () => {
- const startTime = performance.now()
- const request = {
- targetUtilization: 0.75,
- accounts: ['account-1', 'account-2', 'account-3'],
- symbol: 'BTC-USD'
- }
- const response = await controller.executeUtilizationRebalance(request)
- const endTime = performance.now()
- const executionTime = endTime - startTime
- expect(response.success).toBe(true)
- expect(executionTime).toBeLessThan(8000) // 8秒要求
- console.log(`利用率再平衡执行时间: ${executionTime.toFixed(2)}ms`)
- })
- it('should maintain consistent performance under load', async () => {
- const iterations = 10
- const executionTimes: number[] = []
- for (let i = 0; i < iterations; i++) {
- const startTime = performance.now()
- const request = {
- targetDelta: 0.0,
- accounts: ['account-1', 'account-2'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- }
- const response = await controller.executeDeltaControl(request)
- const endTime = performance.now()
- const executionTime = endTime - startTime
- expect(response.success).toBe(true)
- expect(executionTime).toBeLessThan(8000)
- executionTimes.push(executionTime)
- // 短暂间隔避免资源争用
- await new Promise(resolve => setTimeout(resolve, 100))
- }
- const avgExecutionTime = executionTimes.reduce((a, b) => a + b) / iterations
- const maxExecutionTime = Math.max(...executionTimes)
- const minExecutionTime = Math.min(...executionTimes)
- console.log(`性能统计 (${iterations}次迭代):`)
- console.log(` 平均执行时间: ${avgExecutionTime.toFixed(2)}ms`)
- console.log(` 最大执行时间: ${maxExecutionTime.toFixed(2)}ms`)
- console.log(` 最小执行时间: ${minExecutionTime.toFixed(2)}ms`)
- expect(avgExecutionTime).toBeLessThan(5000) // 平均应该更快
- expect(maxExecutionTime).toBeLessThan(8000) // 最大也要符合要求
- })
- })
- describe('10-Second Failover SLA (T044)', () => {
- beforeEach(async () => {
- await controller.start()
- })
- it('should handle hedge service failure within 10 seconds', async () => {
- // 模拟对冲服务失败
- mockHedgeService.executeHedge.mockImplementation(async () => {
- await new Promise(resolve => setTimeout(resolve, 2000)) // 2秒延迟
- throw new Error('Hedge service temporarily unavailable')
- })
- const startTime = performance.now()
- const request = {
- targetDelta: 0.0,
- accounts: ['account-1'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- }
- const response = await controller.executeDeltaControl(request)
- const endTime = performance.now()
- const failoverTime = endTime - startTime
- expect(response.success).toBe(false)
- expect(failoverTime).toBeLessThan(10000) // 10秒故障转移SLA
- console.log(`故障检测和处理时间: ${failoverTime.toFixed(2)}ms`)
- })
- it('should handle risk service timeout within 10 seconds', async () => {
- // 模拟风险服务超时
- mockRiskService.getRiskMetrics.mockImplementation(async () => {
- await new Promise(resolve => setTimeout(resolve, 8000)) // 8秒超时
- throw new Error('Risk service timeout')
- })
- const startTime = performance.now()
- const request = {
- targetUtilization: 0.75,
- accounts: ['account-1'],
- symbol: 'BTC-USD'
- }
- const response = await controller.executeUtilizationRebalance(request)
- const endTime = performance.now()
- const failoverTime = endTime - startTime
- expect(response.success).toBe(false)
- expect(failoverTime).toBeLessThan(10000) // 10秒故障转移SLA
- console.log(`服务超时处理时间: ${failoverTime.toFixed(2)}ms`)
- })
- it('should gracefully degrade when account manager is slow', async () => {
- // 模拟账户管理器响应缓慢
- mockAccountManager.getAccounts.mockImplementation(() => {
- const slowResponse = new Promise(resolve => {
- setTimeout(() => {
- resolve(new Map([
- ['account-1', { netPosition: 0.5, unrealizedPnl: 100 }]
- ]))
- }, 5000) // 5秒延迟
- })
- return slowResponse as any
- })
- const startTime = performance.now()
- const request = {
- targetDelta: 0.0,
- accounts: ['account-1'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- }
- const response = await controller.executeDeltaControl(request)
- const endTime = performance.now()
- const responseTime = endTime - startTime
- // 应该在合理时间内响应,即使依赖服务慢
- expect(responseTime).toBeLessThan(10000) // 10秒SLA
- console.log(`慢速服务降级处理时间: ${responseTime.toFixed(2)}ms`)
- })
- it('should maintain system stability during partial failures', async () => {
- // 模拟部分账户故障
- let callCount = 0
- mockRiskService.getRiskMetrics.mockImplementation(async (accountId) => {
- callCount++
- if (accountId === 'account-2' && callCount <= 2) {
- throw new Error('Account 2 temporarily unavailable')
- }
- await new Promise(resolve => setTimeout(resolve, 100))
- return {
- accountId,
- deltaDeviation: 0.3,
- utilizationRate: 0.7,
- leverageRatio: 2,
- unrealizedPnl: 50,
- maxDrawdown: 100,
- timestamp: Date.now()
- }
- })
- const startTime = performance.now()
- const request = {
- targetUtilization: 0.75,
- accounts: ['account-1', 'account-2', 'account-3'],
- symbol: 'BTC-USD'
- }
- const response = await controller.executeUtilizationRebalance(request)
- const endTime = performance.now()
- const recoveryTime = endTime - startTime
- expect(recoveryTime).toBeLessThan(10000) // 10秒SLA
- console.log(`部分故障恢复时间: ${recoveryTime.toFixed(2)}ms`)
- // 系统应该能够处理部分成功的情况
- expect(response.success).toBeDefined()
- })
- })
- describe('Stress Testing and Performance Benchmarks', () => {
- beforeEach(async () => {
- await controller.start()
- })
- it('should handle high-frequency requests efficiently', async () => {
- const concurrentRequests = 5
- const requests = []
- const startTime = performance.now()
- for (let i = 0; i < concurrentRequests; i++) {
- requests.push(
- controller.executeDeltaControl({
- targetDelta: 0.0,
- accounts: [`account-${i % 3 + 1}`],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- })
- )
- }
- const responses = await Promise.all(requests)
- const endTime = performance.now()
- const totalTime = endTime - startTime
- expect(totalTime).toBeLessThan(15000) // 并发请求应在15秒内完成
- console.log(`${concurrentRequests}个并发请求总时间: ${totalTime.toFixed(2)}ms`)
- // 验证所有请求都有响应
- expect(responses).toHaveLength(concurrentRequests)
- responses.forEach(response => {
- expect(response).toBeDefined()
- })
- })
- it('should demonstrate target performance benchmarks', async () => {
- const benchmarks = {
- singleAccountDelta: 0,
- multiAccountDelta: 0,
- utilizationRebalance: 0,
- riskAssessment: 0
- }
- // 单账户Delta控制基准
- let startTime = performance.now()
- await controller.executeDeltaControl({
- targetDelta: 0.0,
- accounts: ['account-1'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- })
- benchmarks.singleAccountDelta = performance.now() - startTime
- // 多账户Delta控制基准
- startTime = performance.now()
- await controller.executeDeltaControl({
- targetDelta: 0.0,
- accounts: ['account-1', 'account-2', 'account-3'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- })
- benchmarks.multiAccountDelta = performance.now() - startTime
- // 利用率再平衡基准
- startTime = performance.now()
- await controller.executeUtilizationRebalance({
- targetUtilization: 0.75,
- accounts: ['account-1', 'account-2'],
- symbol: 'BTC-USD'
- })
- benchmarks.utilizationRebalance = performance.now() - startTime
- console.log('性能基准测试结果:')
- console.log(` 单账户Delta控制: ${benchmarks.singleAccountDelta.toFixed(2)}ms`)
- console.log(` 多账户Delta控制: ${benchmarks.multiAccountDelta.toFixed(2)}ms`)
- console.log(` 利用率再平衡: ${benchmarks.utilizationRebalance.toFixed(2)}ms`)
- // 验证性能基准
- expect(benchmarks.singleAccountDelta).toBeLessThan(2000) // 2秒目标
- expect(benchmarks.multiAccountDelta).toBeLessThan(5000) // 5秒目标
- expect(benchmarks.utilizationRebalance).toBeLessThan(3000) // 3秒目标
- })
- it('should measure memory usage and cleanup efficiency', async () => {
- const initialMemory = process.memoryUsage()
- // 执行多次操作以测试内存泄漏
- for (let i = 0; i < 50; i++) {
- await controller.executeDeltaControl({
- targetDelta: 0.0,
- accounts: ['account-1'],
- maxDeviation: 0.1,
- symbol: 'BTC-USD'
- })
- if (i % 10 === 0) {
- // 强制垃圾回收测试
- if (global.gc) {
- global.gc()
- }
- }
- }
- const finalMemory = process.memoryUsage()
- const memoryIncrease = finalMemory.heapUsed - initialMemory.heapUsed
- console.log('内存使用情况:')
- console.log(` 初始堆内存: ${(initialMemory.heapUsed / 1024 / 1024).toFixed(2)} MB`)
- console.log(` 最终堆内存: ${(finalMemory.heapUsed / 1024 / 1024).toFixed(2)} MB`)
- console.log(` 内存增长: ${(memoryIncrease / 1024 / 1024).toFixed(2)} MB`)
- // 内存增长应该在合理范围内 (< 50MB for 50 operations)
- expect(memoryIncrease).toBeLessThan(50 * 1024 * 1024)
- })
- })
- })
|