test_websocket_performance.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { PacificaWebSocketClient } from './src/exchanges/pacifica/PacificaWebSocketClient.js'
  2. import { PacificaWebSocketAdapter } from './src/exchanges/pacifica/PacificaWebSocketAdapter.js'
  3. import { PacificaProxyClient } from './src/exchanges/pacifica/PacificaProxyClient.js'
  4. import { logger } from './src/utils/logger.js'
  5. /**
  6. * WebSocket性能测试脚本
  7. * 测试HTTP vs WebSocket的性能差异
  8. */
  9. async function testWebSocketPerformance() {
  10. console.log('🚀 开始WebSocket性能测试...\n')
  11. const client = new PacificaProxyClient()
  12. let httpTimes: number[] = []
  13. let wsTimes: number[] = []
  14. try {
  15. console.log('📊 测试1:获取交易对信息性能对比')
  16. console.log('='.repeat(50))
  17. // 测试HTTP请求性能
  18. console.log('HTTP请求测试:')
  19. client.setWebSocketEnabled(false)
  20. for (let i = 0; i < 5; i++) {
  21. const startTime = Date.now()
  22. try {
  23. await client.getSymbols()
  24. const duration = Date.now() - startTime
  25. httpTimes.push(duration)
  26. console.log(` HTTP请求 ${i + 1}: ${duration}ms`)
  27. } catch (error: any) {
  28. console.log(` HTTP请求 ${i + 1}: 失败 - ${error.message}`)
  29. }
  30. }
  31. await new Promise(resolve => setTimeout(resolve, 2000)) // 等待2秒
  32. // 测试WebSocket请求性能
  33. console.log('\nWebSocket请求测试:')
  34. client.setWebSocketEnabled(true)
  35. // 先初始化WebSocket连接
  36. try {
  37. await client.initializeWebSocket()
  38. console.log('✅ WebSocket连接初始化成功')
  39. } catch (error: any) {
  40. console.log('❌ WebSocket连接初始化失败:', error.message)
  41. console.log('⚠️ 继续测试以展示回退机制...')
  42. }
  43. for (let i = 0; i < 5; i++) {
  44. const startTime = Date.now()
  45. try {
  46. await client.getSymbols()
  47. const duration = Date.now() - startTime
  48. wsTimes.push(duration)
  49. console.log(` WebSocket请求 ${i + 1}: ${duration}ms`)
  50. } catch (error: any) {
  51. console.log(` WebSocket请求 ${i + 1}: 失败 - ${error.message}`)
  52. }
  53. }
  54. // 性能统计
  55. console.log('\n📈 性能统计:')
  56. console.log('='.repeat(50))
  57. if (httpTimes.length > 0) {
  58. const avgHttp = httpTimes.reduce((a, b) => a + b, 0) / httpTimes.length
  59. const minHttp = Math.min(...httpTimes)
  60. const maxHttp = Math.max(...httpTimes)
  61. console.log(`HTTP - 平均: ${avgHttp.toFixed(1)}ms, 最小: ${minHttp}ms, 最大: ${maxHttp}ms`)
  62. }
  63. if (wsTimes.length > 0) {
  64. const avgWs = wsTimes.reduce((a, b) => a + b, 0) / wsTimes.length
  65. const minWs = Math.min(...wsTimes)
  66. const maxWs = Math.max(...wsTimes)
  67. console.log(`WebSocket - 平均: ${avgWs.toFixed(1)}ms, 最小: ${minWs}ms, 最大: ${maxWs}ms`)
  68. if (httpTimes.length > 0) {
  69. const avgHttp = httpTimes.reduce((a, b) => a + b, 0) / httpTimes.length
  70. const improvement = (((avgHttp - avgWs) / avgHttp) * 100).toFixed(1)
  71. console.log(`\n🚀 WebSocket相比HTTP性能提升: ${improvement}%`)
  72. }
  73. }
  74. console.log('\n🔗 连接状态测试:')
  75. console.log('='.repeat(50))
  76. console.log(`WebSocket连接状态: ${client.isWebSocketConnected() ? '已连接' : '未连接'}`)
  77. console.log(`WebSocket队列长度: ${client.getWebSocketQueueLength()}`)
  78. // 测试价格获取
  79. console.log('\n💰 价格获取测试:')
  80. console.log('='.repeat(50))
  81. try {
  82. const startTime = Date.now()
  83. const prices = await client.getPrices()
  84. const duration = Date.now() - startTime
  85. console.log(`✅ 价格获取成功: ${duration}ms`)
  86. console.log(` 数据长度: ${JSON.stringify(prices).length} 字符`)
  87. } catch (error: any) {
  88. console.log(`❌ 价格获取失败: ${error.message}`)
  89. }
  90. // 测试订单簿获取
  91. console.log('\n📚 订单簿获取测试:')
  92. console.log('='.repeat(50))
  93. try {
  94. const startTime = Date.now()
  95. const orderbook = await client.getOrderBook('BTC-USD')
  96. const duration = Date.now() - startTime
  97. console.log(`✅ 订单簿获取成功: ${duration}ms`)
  98. console.log(` 数据长度: ${JSON.stringify(orderbook).length} 字符`)
  99. } catch (error: any) {
  100. console.log(`❌ 订单簿获取失败: ${error.message}`)
  101. }
  102. } catch (error: any) {
  103. console.error('❌ 测试过程中发生错误:', error.message)
  104. } finally {
  105. // 清理资源
  106. try {
  107. await client.close()
  108. console.log('\n🧹 资源清理完成')
  109. } catch (error: any) {
  110. console.log('⚠️ 资源清理时发生错误:', error.message)
  111. }
  112. }
  113. console.log('\n✅ WebSocket性能测试完成!')
  114. }
  115. // 运行测试
  116. if (import.meta.url === `file://${process.argv[1]}`) {
  117. testWebSocketPerformance().catch(error => {
  118. console.error('🚨 测试失败:', error)
  119. process.exit(1)
  120. })
  121. }
  122. export { testWebSocketPerformance }