Files
mp-weixin-2811-xcx.aigc-qui…/scripts/ollama/test-parallel.js
2025-12-28 08:13:13 +08:00

252 lines
8.5 KiB
JavaScript

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const { Worker, isMainThread } = require('worker_threads');
const { processDirectory } = require('./optimized-processor.js');
/**
* 测试并行处理功能
*/
async function testParallelProcessing() {
console.log('🧪 Testing Parallel Processing');
console.log('==============================');
console.log('');
// 创建测试目录
const testDir = path.join(__dirname, 'parallel-test');
const testOptimizedDir = testDir + '-optimized';
// 清理旧的测试目录
if (fs.existsSync(testDir)) {
fs.rmSync(testDir, { recursive: true, force: true });
}
if (fs.existsSync(testOptimizedDir)) {
fs.rmSync(testOptimizedDir, { recursive: true, force: true });
}
fs.mkdirSync(testDir, { recursive: true });
// 创建多个测试文件
console.log('📁 Creating test files...');
const testFiles = [];
for (let i = 0; i < 10; i++) {
const fileName = `test-file-${i}.js`;
const filePath = path.join(testDir, fileName);
// 生成包含console语句的测试代码
const testCode = `
// Test file ${i}
function test${i}(){
console.log("Test ${i} started");
const data = {
id: ${i},
name: "test${i}",
values: [1, 2, 3, 4, 5]
};
console.info("Processing data:", data);
console.warn("This is a warning from file ${i}");
console.error("Error simulation in file ${i}");
data.processed = true;
console.debug("Processing complete for file ${i}");
return data;
}
class TestClass${i} {
constructor() {
console.log("TestClass${i} constructor");
this.value = ${i} * 10;
console.debug("Value set to:", this.value);
}
getValue() {
console.info("Getting value from TestClass${i}");
return this.value;
}
}
console.log("Module ${i} loaded");
module.exports = { test${i}, TestClass${i} };
`;
fs.writeFileSync(filePath, testCode);
testFiles.push(fileName);
}
console.log(`✅ Created ${testFiles.length} test files`);
console.log('');
// 测试并行处理
console.log('🚀 Testing Parallel Processing...');
const parallelStart = Date.now();
try {
const parallelResult = await processDirectory(testDir, {
useOllama: false, // 使用本地方法避免Ollama依赖
parallel: true, // 启用并行处理
dryRun: false // 实际处理
});
const parallelTime = Date.now() - parallelStart;
console.log('');
console.log('📊 Parallel Processing Results:');
console.log(` Processing time: ${parallelTime}ms`);
console.log(` Files processed: ${parallelResult.successful}`);
console.log(` Average time per file: ${(parallelTime / parallelResult.successful).toFixed(1)}ms`);
// 测试单线程处理作为对比
console.log('');
console.log('🐌 Testing Single-Thread Processing...');
const singleStart = Date.now();
// 清理之前的输出目录
if (fs.existsSync(testOptimizedDir)) {
fs.rmSync(testOptimizedDir, { recursive: true, force: true });
}
const singleResult = await processDirectory(testDir, {
useOllama: false, // 使用本地方法
parallel: false, // 关闭并行处理
dryRun: false
});
const singleTime = Date.now() - singleStart;
console.log('');
console.log('📊 Single-Thread Processing Results:');
console.log(` Processing time: ${singleTime}ms`);
console.log(` Files processed: ${singleResult.successful}`);
console.log(` Average time per file: ${(singleTime / singleResult.successful).toFixed(1)}ms`);
// 性能对比
console.log('');
console.log('🏁 Performance Comparison:');
console.log('================================');
const speedup = singleTime / parallelTime;
const timeSaved = singleTime - parallelTime;
const timeSavedPercent = ((timeSaved / singleTime) * 100).toFixed(1);
console.log(`Parallel time: ${parallelTime}ms`);
console.log(`Single time: ${singleTime}ms`);
console.log(`Speed improvement: ${speedup.toFixed(2)}x faster`);
console.log(`Time saved: ${timeSaved}ms (${timeSavedPercent}%)`);
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('⚠️ Parallel processing may not show significant improvement for small files');
}
// 验证输出文件
console.log('');
console.log('🔍 Verifying output files...');
const outputFiles = fs.readdirSync(testOptimizedDir).filter(f => f.endsWith('.js'));
console.log(`✅ Generated ${outputFiles.length} optimized files`);
// 检查第一个文件的内容
if (outputFiles.length > 0) {
const firstOutputPath = path.join(testOptimizedDir, outputFiles[0]);
const firstOutputContent = fs.readFileSync(firstOutputPath, 'utf8');
const hasConsole = firstOutputContent.includes('console.');
if (hasConsole) {
console.log('⚠️ Warning: Output still contains console statements');
} else {
console.log('✅ Console statements successfully removed');
}
}
} catch (error) {
console.error('❌ Test failed:', error.message);
console.error(error.stack);
} finally {
// 清理测试文件
console.log('');
console.log('🧹 Cleaning up test files...');
if (fs.existsSync(testDir)) {
fs.rmSync(testDir, { recursive: true, force: true });
}
if (fs.existsSync(testOptimizedDir)) {
fs.rmSync(testOptimizedDir, { recursive: true, force: true });
}
console.log('✅ Cleanup completed');
}
}
/**
* 检查Worker线程环境
*/
function checkWorkerEnvironment() {
console.log('🔍 Worker Thread Environment Check');
console.log('===================================');
console.log(`isMainThread: ${isMainThread}`);
console.log(`Worker threads available: ${typeof Worker !== 'undefined'}`);
console.log(`Node.js version: ${process.version}`);
console.log('');
}
/**
* 显示并行处理配置信息
*/
function showParallelConfig() {
console.log('⚙️ Parallel Processing Configuration');
console.log('==================================');
const config = {
maxConcurrentWorkers: 4,
workerScript: path.join(__dirname, 'worker.js'),
condition: 'jsFiles.length > 3 AND parallel=true AND isMainThread=true'
};
console.log(`Max concurrent workers: ${config.maxConcurrentWorkers}`);
console.log(`Worker script location: ${config.workerScript}`);
console.log(`Activation condition: ${config.condition}`);
console.log('');
}
// 主程序
async function main() {
console.log('🧪 Parallel Processing Test Suite');
console.log('=================================');
console.log('');
checkWorkerEnvironment();
showParallelConfig();
if (!isMainThread) {
console.log('⚠️ This test should only be run in the main thread');
return;
}
try {
await testParallelProcessing();
} catch (error) {
console.error('❌ Parallel test failed:', error.message);
process.exit(1);
}
console.log('');
console.log('🎉 Parallel processing test completed!');
console.log('');
console.log('💡 To use parallel processing in your projects:');
console.log(' node scripts/optimize-dist.js # Automatic for >3 files');
console.log(' node scripts/optimized-processor.js ./dist --parallel');
}
if (require.main === module) {
main().catch(console.error);
}
module.exports = {
testParallelProcessing,
checkWorkerEnvironment,
showParallelConfig
};