使用Java优化本机消息主机以获得更大的字符串

时间:2015-08-09 01:12:17

标签: java performance chrome-native-messaging

我正在使用Chrome的Native Messaging API以Java格式将数据传递给我的主机。数据是一个512 KB长的字符串,用Base64编码。问题是主机花了太长时间才能从标准输入中读取数据。 我阅读了以下帖子:Very Slow to pass "large" amount of data from Chrome Extension to Host (written in C#)我明白问题是我如何读取字节但是到目前为止我无法将该代码调整为java。

我的主机代码是:

try {

    // hilo principal de la aplicacion
    while(true){

        int length = 0;
        String input = "";
        String output = "";
        String outputType = "";

        // cargamos la logitud de caracteres en bytes
        byte[] bytes = new byte[4];
        System.in.read(bytes, 0, 4);
        length = getInt(bytes);

        // cargamos los datos enviados
        byte[] data = new byte[length];
        System.in.read(data, 0, length);

        if (length == 0){
            // si no recibimos datos ponemos un sleep para no comer todos los recursos del equipo
            Thread.sleep(50);
            break;
        }else{
            // Loop getchar to pull in the message until we reach the total length provided.
            for (int i=0; i < length; i++){

                input += (char) data[i];
            }

            // leemos el texto enviado del dato en JSON
            JSONObject obj = new JSONObject(input);
            String texto = obj.getString("text");

            System.err.write(("TEXT: " + texto).getBytes());

            // creamos el mensaje de respuesta y lo enviamos
            String respuesta = "{\"type\":\"TEST\", \"text\":\"" + texto + "\"}";

            System.out.write(getBytes(respuesta.length()));
            System.out.write(respuesta.getBytes(Charset.forName("UTF-8")));
        }

    }

} catch (Exception e) {
    e.printStackTrace();
}

我需要帮助来调整我的主机代码在java中快速阅读消息。

1 个答案:

答案 0 :(得分:1)

  • 您可以使用DataInputStream.readInt().readFully()完成大部分操作,并且没有错误。如果您使用的是Intel,则需要重新排列int作为本机字节顺序,因为它会读取网络字节顺序。
  • BufferedInputStream之间添加System.in:这将解决主要的性能问题。
  • 通过new String(data,...)解决其他性能问题,而不是附加循环。
  • 很难理解为什么他们会给你一个零长度,但如果他们这样做,除了浪费时间之外,睡觉并不能完成任何事情。删除它。