#!/usr/bin/env node const { Worker, isMainThread } = require('worker_threads'); const path = require('path'); const fs = require('fs'); // 简单的Worker代码 const workerCode = ` const { parentPort, workerData } = require('worker_threads'); const fs = require('fs'); const { inputPath, outputPath } = workerData; function simpleConsoleRemover(jsCode) { return jsCode.replace(/console\.(log|error|warn|info|debug)\s*\([^)]*\);?\s*/g, ''); } async function processFile() { try { const originalCode = fs.readFileSync(inputPath, 'utf8'); const cleanedCode = simpleConsoleRemover(originalCode); // 确保输出目录存在 const path = require('path'); const outputDir = path.dirname(outputPath); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } fs.writeFileSync(outputPath, cleanedCode, 'utf8'); parentPort.postMessage({ success: true, inputSize: originalCode.length, outputSize: cleanedCode.length, reduction: originalCode.length - cleanedCode.length }); } catch (error) { parentPort.postMessage({ success: false, error: error.message }); } } processFile(); `; async function testSimpleParallel() { console.log('🧪 Simple Parallel Processing Test'); console.log('================================='); console.log(''); if (!isMainThread) { console.log('⚠️ This test must be run in main thread'); return; } // 创建测试环境 const testDir = path.join(__dirname, 'simple-test'); const testOptimizedDir = testDir + '-parallel'; // 清理旧目录 [testDir, testOptimizedDir].forEach(dir => { if (fs.existsSync(dir)) { fs.rmSync(dir, { recursive: true, force: true }); } }); fs.mkdirSync(testDir, { recursive: true }); // 创建测试文件 console.log('📁 Creating test files...'); const testFiles = []; for (let i = 0; i < 8; i++) { const fileName = `test-${i}.js`; const filePath = path.join(testDir, fileName); const testContent = ` // Test file ${i} function test${i}() { console.log("Starting test ${i}"); const data = { id: ${i}, value: Math.random() }; console.info("Data created:", data); console.warn("Warning from test ${i}"); return data; } console.log("Module ${i} loaded"); `; fs.writeFileSync(filePath, testContent); testFiles.push({ fileName, filePath }); } console.log(`✅ Created ${testFiles.length} test files`); console.log(''); // 并行处理测试 console.log('🚀 Testing Parallel Processing...'); const parallelStart = Date.now(); // 创建Workers const workers = []; const results = []; for (let i = 0; i < testFiles.length; i++) { const { fileName, filePath } = testFiles[i]; const outputPath = path.join(testOptimizedDir, fileName); const worker = new Worker(workerCode, { eval: true, workerData: { inputPath: filePath, outputPath } }); workers.push(worker); worker.on('message', (result) => { results.push({ file: fileName, ...result }); console.log(`${result.success ? '✅' : '❌'} ${fileName}`); if (result.success) { console.log(` Size: ${result.inputSize} → ${result.outputSize} chars (${result.reduction} removed)`); } else { console.log(` Error: ${result.error}`); } }); worker.on('error', (error) => { results.push({ file: fileName, success: false, error: error.message }); console.log(`❌ ${fileName}: ${error.message}`); }); } // 等待所有Workers完成 await new Promise((resolve) => { let completed = 0; const totalWorkers = workers.length; workers.forEach(worker => { worker.on('exit', () => { completed++; if (completed === totalWorkers) { resolve(); } }); }); }); const parallelTime = Date.now() - parallelStart; console.log(''); console.log('📊 Parallel Results:'); console.log(` Processing time: ${parallelTime}ms`); console.log(` Files processed: ${results.filter(r => r.success).length}/${results.length}`); const totalReduction = results.reduce((sum, r) => sum + (r.reduction || 0), 0); console.log(` Total reduction: ${totalReduction} characters`); console.log(` Avg time per file: ${(parallelTime / results.length).toFixed(1)}ms`); // 验证输出 console.log(''); console.log('🔍 Verifying output...'); if (fs.existsSync(testOptimizedDir)) { const outputFiles = fs.readdirSync(testOptimizedDir); console.log(`✅ Generated ${outputFiles.length} output files`); // 检查第一个文件 const firstOutputPath = path.join(testOptimizedDir, outputFiles[0]); const firstOutputContent = fs.readFileSync(firstOutputPath, 'utf8'); const hasConsole = firstOutputContent.includes('console.'); console.log(` Console removal: ${hasConsole ? '❌ Failed' : '✅ Success'}`); } // 清理 console.log(''); console.log('🧹 Cleaning up...'); [testDir, testOptimizedDir].forEach(dir => { if (fs.existsSync(dir)) { fs.rmSync(dir, { recursive: true, force: true }); } }); console.log('✅ Test completed!'); return { totalTime: parallelTime, successful: results.filter(r => r.success).length, total: results.length, totalReduction }; } async function testSingleThread() { console.log('🐌 Testing Single-Thread Processing...'); const testDir = path.join(__dirname, 'simple-test'); const testSingleDir = testDir + '-single'; // 简单的本地处理函数 function simpleConsoleRemover(jsCode) { return jsCode.replace(/console\.(log|error|warn|info|debug)\s*\([^)]*\);?\s*/g, ''); } const singleStart = Date.now(); let totalReduction = 0; let successful = 0; const files = fs.readdirSync(testDir).filter(f => f.endsWith('.js')); for (const fileName of files) { const inputPath = path.join(testDir, fileName); const outputPath = path.join(testSingleDir, fileName); try { const originalCode = fs.readFileSync(inputPath, 'utf8'); const cleanedCode = simpleConsoleRemover(originalCode); const outputDir = path.dirname(outputPath); if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); } fs.writeFileSync(outputPath, cleanedCode, 'utf8'); totalReduction += originalCode.length - cleanedCode.length; successful++; } catch (error) { console.log(`❌ ${fileName}: ${error.message}`); } } const singleTime = Date.now() - singleStart; console.log(` Processing time: ${singleTime}ms`); console.log(` Files processed: ${successful}/${files.length}`); console.log(` Total reduction: ${totalReduction} characters`); console.log(` Avg time per file: ${(singleTime / files.length).toFixed(1)}ms`); return { totalTime: singleTime, successful, total: files.length, totalReduction }; } // 主测试函数 async function main() { console.log('🎯 Worker Thread Parallel Processing Test'); console.log('========================================'); console.log(''); try { // 测试并行处理 const parallelResult = await testSimpleParallel(); // 测试单线程处理(使用相同的测试文件) const singleResult = await testSingleThread(); // 性能对比 console.log(''); console.log('🏁 Performance Comparison:'); console.log('==========================='); console.log(`Parallel: ${parallelResult.totalTime}ms (${parallelResult.successful} files)`); console.log(`Single: ${singleResult.totalTime}ms (${singleResult.successful} files)`); if (parallelResult.totalTime > 0 && singleResult.totalTime > 0) { const speedup = singleResult.totalTime / parallelResult.totalTime; console.log(`Speedup: ${speedup.toFixed(2)}x`); if (speedup > 1.5) { console.log('🎉 Parallel processing is significantly faster!'); } else if (speedup > 1.1) { console.log('✅ Parallel processing shows improvement'); } else { console.log('⚠️ Overhead may outweigh benefits for small files'); } } console.log(''); console.log('💡 Parallel processing benefits increase with:'); console.log(' • Larger file sizes'); console.log(' • More files to process'); console.log(' • More complex processing logic'); console.log(' • When using Ollama AI processing'); } catch (error) { console.error('❌ Test failed:', error.message); console.error(error.stack); } } if (require.main === module) { main().catch(console.error); } module.exports = { testSimpleParallel, testSingleThread };