librawspeed
Version:
Node.js Native Addon for LibRaw - Process RAW image files with JavaScript
148 lines (132 loc) • 4.42 kB
JavaScript
const LibRaw = require("../lib/index.js");
const path = require("path");
const fs = require("fs");
async function performanceTest() {
console.log("LibRaw 快速性能测试");
console.log("===========================\n");
const rawFile = "sample-images/012A0459.CR3";
const outputDir = "examples/performance-test";
// 确保输出目录存在
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
console.log(`📁 测试文件: ${rawFile}`);
try {
// 加载 RAW 文件
const libraw = new LibRaw();
await libraw.loadFile(rawFile);
const info = await libraw.getMetadata();
console.log(`📷 相机: ${info.make} ${info.model}`);
console.log(`📐 尺寸: ${info.width}x${info.height}`);
console.log(
`📊 百万像素: ${((info.width * info.height) / 1000000).toFixed(1)}MP\n`
);
// 测试 1:超快速转换
console.log("🚀 测试 1:超快速转换 (effort=1, 无 mozjpeg)");
const start1 = Date.now();
await libraw.convertToJPEGFast(
path.join(outputDir, "012A0459_ultrafast.jpg"),
{
quality: 80,
fastMode: true,
effort: 1,
mozjpeg: false,
progressive: false,
}
);
const time1 = Date.now() - start1;
const stats1 = fs.statSync(path.join(outputDir, "012A0459_ultrafast.jpg"));
console.log(` ✅ 时间: ${time1}ms`);
console.log(` 📊 大小: ${(stats1.size / 1024).toFixed(1)}KB\n`);
// 测试 2:多尺寸生成
console.log("📐 测试 2:多尺寸生成(3 个尺寸并行)");
const start2 = Date.now();
const multiResult = await libraw.convertToJPEGMultiSize(
path.join(outputDir, "012A0459_multi"),
{
sizes: [
{ name: "thumbnail", width: 400, quality: 75, effort: 1 },
{ name: "web", width: 1920, quality: 80, effort: 2 },
{ name: "full", quality: 85, effort: 3 },
],
}
);
const time2 = Date.now() - start2;
console.log(` ✅ 总时间: ${time2}ms`);
console.log(` 📊 每个尺寸平均: ${multiResult.averageTimePerSize}`);
console.log(` 📁 生成的文件:`);
for (const [key, size] of Object.entries(multiResult.sizes)) {
console.log(
` ${size.name}: ${(size.fileSize / 1024).toFixed(1)}KB (${
size.processingTime
}ms)`
);
}
console.log();
// 测试 3:高并发批量转换
console.log(
"⚡ 测试 3:批量处理(使用单独文件模拟)"
);
const batchFiles = [
"sample-images/012A0459.CR3",
"sample-images/012A0879.CR3",
"sample-images/020A0045.CR3",
];
const start3 = Date.now();
let successCount = 0;
for (let i = 0; i < batchFiles.length; i++) {
try {
const batchLibraw = new LibRaw();
await batchLibraw.loadFile(batchFiles[i]);
await batchLibraw.convertToJPEGFast(
path.join(outputDir, `batch_${path.parse(batchFiles[i]).name}.jpg`),
{
quality: 85,
fastMode: true,
effort: 2,
}
);
await batchLibraw.close();
successCount++;
} catch (error) {
console.log(
` ❌ 处理失败 ${batchFiles[i]}: ${error.message}`
);
}
}
const time3 = Date.now() - start3;
console.log(` ✅ 总时间: ${time3}ms`);
console.log(` 📊 已处理文件: ${successCount}/${batchFiles.length}`);
console.log(
` ⚡ 每个文件平均: ${(time3 / successCount).toFixed(0)}ms\n`
);
// 性能汇总
console.log("📊 性能汇总:");
console.log("======================");
console.log(`🚀 超快速单张: ${time1}ms`);
console.log(
`📐 多尺寸 (3x): ${time2}ms (${(time2 / 3).toFixed(0)}ms 平均)`
);
console.log(
`⚡ 批量 (3 文件): ${time3}ms (${(time3 / 3).toFixed(0)}ms 平均)`
);
console.log(
`\n🎯 性能提升: 比原始版本快约 ${Math.round(
7000 / time1
)} 倍!`
);
await libraw.close();
} catch (error) {
console.error("❌ 错误:", error.message);
process.exit(1);
}
}
performanceTest()
.then(() => {
console.log("\n✅ 性能测试完成!");
})
.catch((error) => {
console.error("❌ 测试失败:", error);
process.exit(1);
});