1

我有一堂课,例如:

 private class verifierListener implements SerialPortEventListener {

    String outBuffer;
    char charBuffer;

    public void serialEvent(SerialPortEvent event) {
        if (event.isRXCHAR()) {//If data is available
            timeOut = 1000;
            lastReadTimer = System.currentTimeMillis();
            if (event.getEventValue() > 0) {//Check bytes count in the input buffer

                try {
                     byte[] buffer = verifierPort.readBytes(event.getEventValue());
                     //INSERT CODE HERE
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

            }
        }

有两种可能的实施方法(在该INSERT CODE HERE地区)

案例一:

                        outBuffer = new String(buffer);


                        bfrFile.print(outBuffer);
                        sysOutWriter.append(outBuffer);

案例B:

                            for(byte bt : buffer) {
                                charBuffer = (char) bt;
                                bfrFile.print(charBuffer);
                                sysOutWriter.append(charBuffer);
                            }

编译和运行,并做他们应该做的事情。但我试图让这段代码尽可能无缝地执行,所以我不可能冒在低端 PC 上丢失传输数据的风险。

我假设案例 A 由于 String 初始化会产生更多开销,但我想在删除它之前确定。

你们能说出哪个更清洁,和/或如何确定每个的处理成本吗?

4

2 回答 2

1

即使在低端 PC 上,您也不应该丢失任何数据。那是因为在您的代码和来自串行端口的实际数据之间有(几个)缓冲区(操作系统缓冲区、Java 缓冲区等)。速度方面,除非您经常运行此代码(例如每秒数千次),否则您不会注意到差异。

假设这是一个标准的串行连接,并且您以每秒 115200 位的速度运行,这意味着您每秒最多可以获得 14,400 个字符。即使您一次阅读那些字符,也不应该看到很大的速度影响。

于 2012-01-11T20:28:11.167 回答
1

如果您使用 Windows ctrl-alt-delete 并在线程运行时查看线程并查看它使用的内存。就您的代码而言,我可以建议您使用 StringBuilder 而不是 String。我不确定开销是否真的存在差异,但从良好的代码/编程角度来看,它应该是 A.

于 2012-01-11T20:21:10.397 回答