当前位置: 首页 > 面试题库 >

从Chrome扩展程序向主机传递“大量”数据的速度非常慢(用C#编写)

钱卓君
2023-03-14
问题内容

我正在使用Chrome的本机消息传递API将页面的DOM传递给主机。当我尝试将一个小字符串从扩展名传递到主机时,一切正常,但是当我尝试传递整个DOM(不是那么大…仅260KB左右)时,一切运行都慢得多,最终我得到了Native host has exited error阻止主机响应。

我的主要问题:为什么将250KB-350KB的消息从扩展名传递到主机需要这么长时间?

根据开发者的网站:

Chrome会在一个单独的进程中启动每个本机消息传递主机,并使用标准输入(stdin)和标准输出(stdout)与之通信。双向使用相同的格式发送消息:每条消息都使用JSON(UTF-8编码)进行序列化,并以本机字节顺序开头32位消息长度。来自本地消息传递主机的单个消息的最大大小为1
MB,主要是为了防止Chrome出现异常的本地应用程序行为。 发送到本地消息传递主机的消息的最大大小为4 GB。

我有兴趣发送给主机的页面的DOM不超过260KB(有时为300KB),远低于施加的最大4GB。

popup.js

document.addEventListener('DOMContentLoaded', function() {
    var downloadButton = document.getElementById('download_button');
    downloadButton.addEventListener('click', function() {
        chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
            chrome.tabs.executeScript(tabs[0].id, {file: "getDOM.js"}, function (data) {
                chrome.runtime.sendNativeMessage('com.google.example', {"text":data[0]}, function (response) {
                    if (chrome.runtime.lastError) {
                        console.log("Error: " + chrome.runtime.lastError.message);
                    } else {
                        console.log("Response: " + response);
                    }
                });
            });
        });
    });
});

主机程序

private static string StandardOutputStreamIn() {
    Stream stdin = new Console.OpenStandardInput();
    int length = 0;
    byte[] bytes = new byte[4];
    stdin.Read(bytes, 0, 4);
    length = System.BitConverter.ToInt32(bytes, 0);

    string = "";
    for (int i=0; i < length; i++)
        string += (char)stdin.ReadByte();

    return string;
}

请注意,我从这个问题中找到了上述方法。

目前,我只是想将字符串写入.txt文件:

public void Main(String[] args) {
    string msg = OpenStandardStreamIn();
    System.IO.File.WriteAllText(@"path_to_file.txt", msg);
}
  1. 将字符串写入文件需要很长时间(〜4秒,有时长达10秒)。
  2. 实际编写的文本数量各不相同,但绝不仅限于顶级文档声明和一些IE注释标签 现在将显示所有文本。
  3. 这个几乎没有文本的文件是649KB,但是实际文件应该只有205KB(下载时)。 该文件仍略大于应有的大小(应为205KB时为216KB)。

我已经getDOM.js通过下载文件测试了我的功能,并且整个过程几乎是瞬时的。

我不确定为什么这个过程要花费这么长时间,为什么文件如此之大,或者为什么实际上几乎没有发送任何消息。

我不确定这是否与以特定方式反序列化消息有关,是否应该创建端口而不是使用chrome.runtime.sendNativeMessage(...);方法,或者是否完全缺少其他内容。

非常感谢所有帮助!谢谢!

编辑

尽管我的消息是正确地从扩展名发送到主机的,但我现在Native host has exited error在扩展名接收到主机的消息之前收到了。


问题答案:

这个问题本质上是在问: “我如何高效,快速地从标准输入中读取信息?”

在上面的代码中,问题不在Chrome扩展程序和主机之间,而是在标准输入和从标准输入流读取的方法之间,即StandardOutputStreamIn()

该方法在OP代码中的工作方式是,循环在标准输入流中运行,并将input字符串与新字符串(即从字节流中读取的字符)连续连接在一起。这是一项 昂贵的
操作,我们可以通过创建一个StreamReader对象来立即抓取整个流来解决此问题(特别是因为我们知道前4个字节中包含的长度信息)。因此,我们通过以下方式解决了速度问题:

    public static string OpenStandardStreamIn()
    {
        //Read 4 bytes of length information
        System.IO.Stream stdin = Console.OpenStandardInput();
        int length = 0;
        byte[] bytes = new byte[4];
        stdin.Read(bytes, 0, 4);
        length = System.BitConverter.ToInt32(bytes, 0);

        char[] buffer = new char[length];
        using (System.IO.StreamReader sr = new System.IO.StreamReader(stdin))
        {
            while (sr.Peek() >= 0)
            {
                sr.Read(buffer, 0, buffer.Length);
            }
        }

        string input = new string(buffer);

        return input;
    }

虽然这解决了速度问题,但我不确定扩展名为何抛出Native host has exited error



 类似资料:
  • 我有26个CSV文件,我想每晚从互联网上抓取并上传到Postgresql表中。我使用Java、PreparedStatement和Batch实现了这一点。尽管如此,性能仍然非常缓慢。要获取大约6000个条目并将其放入Postgresql,需要30分钟。这是我第一次做这样的事情,所以我不知道这是快还是慢。 为了获取文件,我使用了以下代码。 然后,我使用PreparedStatement从输入流中提取

  • 问题内容: 我正在构建一个Chrome扩展程序,该扩展程序仅适用于我工作的公司内部的人员。该扩展需要输入-可以通过对共享的MySQL DB服务器的简单查询生成输入(所有员工都可以以只读权限访问该服务器)。 问题是-由于扩展是所有客户端(主要是Javascript)-访问数据库和运行查询的最简单方法是什么?我是否必须创建一个针对扩展名的php / java(/ …)服务? 问题答案: 您必须创建一个

  • 我有一个测试WatchKit扩展项目,它调用WKInterfaceController OpenParentApplication:为了获得显示主ios应用程序的信息,然后查询数据库以获取要发送回watch的数据,如下所示。 但是我一回复就会得到一个sigbat,并且我已经将它缩小到一个事实,即我将nsarray赋给一个字典值的值。 我不明白为什么这是违法的,什么是最好的解决办法? 敬克里斯蒂安·

  • 问题背景: 主机iOS应用程序以每秒10帧的帧速率动态生成UIImage,我只想从WatchKit扩展中检索UIImage数据,并以相同的速率在Watch应用程序上显示图像。 我当前的解决方案: 我为iOS应用和WatchKit扩展设置了一个应用组。iOS应用程序将每个帧写入一个png文件(约10k)到组共享位置,WatchKit扩展使用NSTimer以相同的速率读取文件,然后将数据发布到Watc

  • 问题所在 问题很怪异,出乎意料。上传/下载工作完美,但非常慢。 我在一个良好的互联网连接1MBps,但这些文件从来没有以这种速度传输。它大约是100-150KBps,这几乎是我的网络可用速度的15%。 请注意,我没有更改上载和下载的超时设置。他们违约了。

  • 问题内容: 我面临一个非常奇怪的问题:使用Redis时,我的写入速度非常糟糕(在理想情况下,写入速度应该接近RAM上的写入速度)。 这是我的基准: 是生成随机字符串的类(arg是字符串长度) 以下是几个结果: [写入] nb:100000 |时间:4.408319378 |速度:0.713905907055318 MB / s [写入] nb:100000 |时间:4.4139469070553