java - 在函数内部或外部声明对象

标签 java json optimization

我有一个函数可以解析来自端点的 JSON 响应。我用大约 20k 不同的输入来调用这个函数。像这样的事情:

for (Input input: inputList) {
    // We create a new getRequest with the query
    HttpGet getRequest = new HttpGet(input.getUrl());

    // We make the getRequest accept application/json data
    getRequest.addHeader("Accept", "application/json");

    JSONParser jsonParser = new JSONParser();
    JSONArray parsedArray = new JSONArray();

    CloseableHttpResponse response = httpClient.execute(getRequest);
    InputStream inputStream = response.getEntity().getContent();

    parsedArray = (JSONArray) jsonParser.parse(new InputStreamReader(inputStream, "utf-8"));

    parsedArrays.add(parsedArray);
    response.close();
}

我正在使用json-simple:

    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1.1</version>
    </dependency>

此刻,我在循环内部声明 JSONParser,并且正在考虑在循环外部声明它是否会更好。

是否最好只声明一次解析器,然后将其像参数一样传递给函数,或者 JVM 已经优化了这种事情?

最佳答案

这取决于您是否从不同线程调用该方法。在这种情况下,如果 JSONParser 不是线程安全的,则可能会出现同步问题,并且在方法中实例化 JSONParser 可能会更好。

如果只有一个线程,则可以将 JSONParser 作为方法参数传递。

但我猜堆的增长是因为输入数据而不仅仅是 JSONParser 对象。

垃圾收集器主要在堆已满时被激活(在 HotSpot 中),因此在激活 gc 之前可能需要更多时间。

如果您需要在分配新对象时节省时间(newinvokespecial 和构造函数指令),那么您应该关心这一点,但在这种情况下您需要考虑每一个对象的创建,为此还有其他语言:)。让 JVM 完成它的工作即可:)。

关于java - 在函数内部或外部声明对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31992007/

相关文章:

json - 将 json 数据插入 POSTGRES 表列的文本数据类型

c - brainfuck 解释器的优化

java - 通过不同JVM的接口(interface)实现

java - 将 JComboBox 添加到单元格后,JTable 列不可编辑

java - 如何使用 JSONArray 从数据库中检索项目

php - 这是优化吗?

c - gcc 总是做这种优化吗? (常见的子表达式消除)

java - Java中文件不存在异常

java - 在 gridbaglayout 中将 JLabel 对齐到面板的左侧

php - 输出 1/0//Yes/No 的比较工具