Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当性能受到关注时,如何从文件中读取整数?_Java - Fatal编程技术网

Java 当性能受到关注时,如何从文件中读取整数?

Java 当性能受到关注时,如何从文件中读取整数?,java,Java,我在CodeEval上做一些任务。基本上,任务非常简单:“打印出从文件中读取的所有整数的总和” 我的解决办法如下: import java.io.File; import java.io.IOException; import java.io.BufferedReader; import java.io.FileReader; public class SumIntegersFromFile { public static void main(String args[]) throw

我在CodeEval上做一些任务。基本上,任务非常简单:“打印出从文件中读取的所有整数的总和”

我的解决办法如下:

import java.io.File;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;

public class SumIntegersFromFile {

    public static void main(String args[]) throws IOException{

        File file = new File(args[0]);
         BufferedReader br = new BufferedReader( new FileReader(file));
         String line;
         int i=0;
         while((line=br.readLine())!=null){
            int k = Integer.parseInt(line);
             i+=k;
         }
         br.close();
         System.out.println(i);
    }
}
但有人告诉我,从性能的角度来看,这个解决方案不是最优的

该守则是根据问题中的建议制定的。这里唯一的区别是我读取的是整数而不是字符串


在Java中,从文件中读取整数最有效的方法是什么?

除非明确告诉您,否则您不应该假设总数将符合
int
。尝试将
i
的类型更改为
long
,甚至是
biginger
,看看这是否会对你的分数产生影响

您可以尝试使用
k
(并使用
Long.parseLong(line)
)执行相同的操作。这将取决于问题的确切措辞,但可能单个值也会超过
int
的限制

还有一件事。。。这个问题,正如你所说的,只是说你应该把所有的整数求和。这就留下了这样一种可能性,即存在不是整数的行,在这种情况下,您应该跳过它们,而不是抛出一个
NumberFormatException
(这是您的代码目前要做的)

(大概你已经被告知每行只有一个条目…)


但是,如果您想压缩最后一点性能,则需要将文件作为二进制文件读取,而不是逐行读取:将每一行转换为
字符串
代价太高了。有关如何执行此操作的详细说明,请参见。

我认为代码的性能没有问题。也就是说,我不同意你的程序有任何问题的说法

从文件或通过网络读取数据要比在内存中处理数据慢几个数量级。因此,将I/O与内存中的某些数据操作混合在一起的代码的性能通常由I/O所花费的时间决定。对内存中的数据操作的调整很少值得。如果I/O操作与数据操作并行进行(如果O/S执行一些预读操作,则会出现这种情况),数据操作几乎是免费的:加快数据操作速度不会减少所需时间,因为数据操作CPU时间的任何减少都会被等待输入时程序阻塞时间的增加精确抵消

执行I/O且需要良好性能的程序必须减少阻塞等待I/O的时间。它们的运行方式应使它们能够利用硬件和操作系统提供的优化来减少阻塞量

重要的是,在低级别,磁盘和网络不会在每次操作中占用少量字节。它们使用较大的数据包或数据块单位。与操作系统交互以读取的字节数少于存储在一个磁盘块中的字节数是浪费的。程序通过缓冲其I/O来避免这样做,因此程序本身将许多小I/O操作的序列更改为更少但更大的操作。您正在使用一个
BufferedReader
,因此您已经在这样做了


操作系统可能会进行一些预读:如果您在文件开头请求块中的字节,它可能会猜测您可能会按顺序读取文件,因此它也可以获取文件的一些后续块,因为您的程序也需要这些块。按顺序读取文件可以提供更好的性能。您已经在这样做了。

什么是“我从35中只得到了29.352”呢?这个问题似乎离题了,因为它是关于改进工作代码的。试着把它贴到@Keppil和所有投票关闭的人:你能指出帮助中心中这个问题不符合的特定文本吗?在我看来,这似乎符合那里所定义的范围。@chiastic:我同意这并不像它可能的那么清楚。当涉及到检查和改进工作代码时,我们致力于此,因此我认为应该在那里提出这个问题。@Keppil我同意它在代码检查的范围内,但我不认为这会使它超出范围。有许多问题可以在不止一个地方合法地提出。SO上的大量问题都是这样的:有人发布了一些“有效”但效率低下的代码,并希望得到一些改进的线索,例如,并没有人会反对。谢谢你们的回答。我正确地解决了这个问题,问题是它没有那么优化。完整的描述在这里:你能发布对分数的完整分析吗?它能给你多少细节?是的,你可以在这里找到:最大内存=20*1024*1024#20 MB最大时间=10*1000#10秒#如果提交时间超过10秒#或者使用超过20MB的内存#如果内存占用>最大内存或时间占用>最大时间#则分数为0:返回0最大总分数=总分数#[类别]记忆系数=1-记忆系数/最大记忆时间系数=1-时间系数/最大记忆时间系数=(记忆系数+时间系数)/2返回分数*max_total_分数*因子/100好的,我也添加了一个提高性能的建议。它依赖于假设整个事情都能放在内存中。这看起来真的很迂腐:任何明智的程序员都会像你一样编写代码。@IvanT我问了一个新问题,希望能给你一些启示我对你的答案有了更多的了解,但也提出了一些进一步的问题: