【问题标题】:need advice regarding design and performance issue需要有关设计和性能问题的建议
【发布时间】:2015-11-18 09:00:34
【问题描述】:

我以非常高的速率从服务器检索数据,发送的数据采用类似于以下格式的消息形式:

$FMSn,par1,par2...,...,...,...,..,...,....,par20 //where n is number ranges from 1 to 12

我需要处理这条消息以解析一些数据。

但服务器以不同格式发送其他消息的频率较低,该消息不重要并且可以被丢弃,它与前面描述的格式消息之间的区别在于 上一条消息以 $FMS 开头,而另一条则不是。

为了区分这些消息以了解应该处理哪个消息,我创建了一个 FMSParser 类,如下所示,并检查消息头是否为

$FMS

或者不。

我的问题是,我应该在接收来自服务器的消息的循环中创建一个 FMSParser 类的新对象,还是在整个循环中创建一个对象 程序并在接收数据的循环中,我只需调用 isValid 方法和 getParam()。换句话说,在代码中:

我应该选择解决方案 1 还是 2?

解决方案 1

 loop for messages receiving:

    msg = receive message();
    fmsParser = new FMSParser(msg);

    if (fmsParser.isValid) {
        params = fmsParser.getParam();
    }

解决方案 2

 fmsParser = new FMSParser();
 loop for messages receiving:

    msg = receive message();

    if (fmsParser.isValid(msg)) {
        params = fmsParser.getParam();
    }

代码

private class FMSParser {

private final static String HEADER = "$FMS"
private String[] mSplittedMsg;

    FMSParser() {}

    public boolean isValidMsg(String msg) {
        boolean isValid = false;

        this.mSplittedMsg = msg.split(",");

        for (int i = 0; i < 12; i++) {

            if (splittedMsg[0].equals(HEADER+i)) {
                valid = true;
                break;
            }
        }

        return valid;
    }

    public String [] getParam() {
        return this.mSplittedMsg;
    }

}

【问题讨论】:

    标签: java android class object


    【解决方案1】:

    如果每次循环都构造一个新的 FMSParser,它会需要内存分配和垃圾回收。

    我会选择选项 3,它使 FMSParser 不可变,这意味着它是线程安全的。

    FMSParser fmsParser = new FMSParser();
    while (messageIterator.hasNext()) {
       String msg = messageIterator.next();
       if (fmsParser.isValid(msg)) {
           params = fmsParser.getParam(msg);
       }
    }
    

    例如:

    public class FMSParser {
        public boolean isValid(String msg) {
           return msg.startsWith("$FMS");
        }
    
        public String[] getParams(String msg) {
           return msg.split(",");
        }
    }
    

    【讨论】:

    • 谢谢你的回答......但我认为它与选项2相同
    • 不,不是。有一个显着的区别,我的选项 3 将消息字符串传递给 isValid(msg)getParam(msg)。这意味着 FMSParser 可以是不可变的/无状态的
    • 你的选项 2 假设 isValid() 总是在 getParam() 之前被调用
    • 请多多包涵,我无法意识到您在第一个片段中发布的代码与我在上面发布的解决方案2之间有任何区别......我意识到的唯一区别是 getParams 方法......在我的解决方案中没有任何参数发送给它,在你的回答中它接收 msg 作为参数
    • 是的......这个非常显着的差异意味着我的解决方案可以是无状态的。在您的解决方案中,您在 FMSParser 中的 isValid() 和 getparam() 之间保持可变状态。这意味着它不是线程安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多