C# svg2png性能

C# svg2png性能,c#,node.js,asp.net-core,asp.net-core-2.0,C#,Node.js,Asp.net Core,Asp.net Core 2.0,我对svg2png的速度有困难,不知道是否有办法提高它。我在用D3制作雷达图。这些都是由jsdom中的Node.js呈现的。生成的SVG使用svg2png转换为PNG。这样做的目的是将图像插入到提供给最终用户的报告中。渲染雷达图的javascript也在应用程序中使用(没有node.js),并且运行速度非常快 使用.NET core 2.1和Node.js v8.11.2 将svg转换为png所需的时间约为2-3秒 节点服务的调用 public async Task<string>

我对svg2png的速度有困难,不知道是否有办法提高它。我在用D3制作雷达图。这些都是由jsdom中的Node.js呈现的。生成的SVG使用svg2png转换为PNG。这样做的目的是将图像插入到提供给最终用户的报告中。渲染雷达图的javascript也在应用程序中使用(没有node.js),并且运行速度非常快

使用.NET core 2.1和Node.js v8.11.2

将svg转换为png所需的时间约为2-3秒

节点服务的调用

public async Task<string> GetRadarChartAsync(dynamic options)
{          
  return await _nodeServices.InvokeAsync<string>("./wwwroot/js/node-radar-chart.js", options);
}
公共异步任务GetRadarChartAsync(动态选项) { return wait _nodeServices.InvokeAsync(“./wwwroot/js/node radar chart.js”,选项); } 这就是所谓的像这样和base64图像提取

Task<string> result = (Task<string>)mapped_function.DynamicInvoke(objects.ToArray<object>());
string img_base64 = result.Result;
Task result=(Task)映射了函数.DynamicInvoke(objects.ToArray());
字符串img_base64=result.result;
javascript包装器如下所示

module.exports = function(callback, options, data) {

   const dom = new JSDOM(`<!DOCTYPE html><div id="body" class="radar-chart"></div>`); 

   var options1 = {
       window: dom.window,
       selector: '.radar-chart',
       data: JSON.parse(data.radar)
   }

   var options_combined = Object.assign(options1, options);

   var chart1 = new RadarChart(options_combined);

   // Convert SVG to PNG and return it to controller
   var svgText = chart1.html();

   svg2png(Buffer.from(svgText))           
      .then(buffer => buffer.toString('base64'))
      .then(buffer => callback(null, buffer));

}
module.exports=函数(回调、选项、数据){
constdom=newjsdom(``);
变量选项1={
window:dom.window,
选择器:“.雷达图”,
数据:JSON.parse(data.radar)
}
var options_combined=Object.assign(选项1,选项);
var chart1=新雷达艺术(选项组合);
//将SVG转换为PNG并返回控制器
var svgText=chart1.html();
svg2png(Buffer.from(svgText))
.then(buffer=>buffer.toString('base64'))
.then(buffer=>callback(null,buffer));
}
2018年8月14日更新

以前错误地将此问题标记为节点和.NET Core 2.1之间的调用问题。进一步调查显示,svg2png是导致问题的原因

进一步更新

问题可能是由于svg2png使用幻影。提议的想法是允许svg2png在多个调用中使用同一个PhantomJS实例,但目前还没有关于这个问题的开发。看

在出现更好的解决方案之前,我必须解决速度问题。

当我尝试使用(尤其是服务器端渲染)时,使用.NET 2.0时,调用时间至少为1秒。当我尝试使用.NET2.1时,如果我没有记错的话,我想它会减少到100ms或更少。因此,NodeServices调用时间有可能从2.0大幅提高到2.1


如果无法升级,那么您可能需要重构,以便只需调用一次节点服务。

我从未使用过SVG2PN,但我看到您使用了
buffer.toString('base64')
,这可能效率不太高。我可以想象这种情况会发生:

  • 整个缓冲区被读取到最后,并同时转换为Base64,而Base64本身在磁盘上的大小方面不是很有效(据我所知)

  • 然后整个转换从Node转移到ASP.NET,我想这里可能会有一些序列化,这将是巨大的Base64内容(?)的缓慢过程


  • 我会研究在两边使用流,因为这是媒体文件通常使用的方法。

    当你分析它时,瓶颈似乎在哪里?@mjwills。在js中的回调和(svg2png完成后)并通过img_base64=result.results接收结果后,使用相同的设置解决上述性能问题,期待解决此问题。在我的例子中,当调用一个Node JS实例时,会生成50多个图表。我能够并且刚刚升级到.NET Core v2.1。不幸的是,它并没有提高性能,或者说只是略微提高了一点。从任务返回图像时,仍然需要2-3秒的等待。我喜欢这个想法,但我似乎无法从节点返回流。jsI在这里找到了一个示例(在“示例2:从节点获取二进制数据流”下):嘿@PeterHenry,你查看了吗(我之前的评论)?