chore: 增加scripts目录
This commit is contained in:
252
scripts/ollama/test-parallel.js
Normal file
252
scripts/ollama/test-parallel.js
Normal file
@@ -0,0 +1,252 @@
|
||||
#!/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
|
||||
};
|
||||
Reference in New Issue
Block a user