今天早些时候感到无聊,我开始考虑Java中缓冲和无缓冲字节流的相对性能.作为一个简单的测试,我下载了一个相当大的文本文件并编写了一个简短的程序来确定缓冲流在复制文件时的效果.进行了四项测试:
不出所料,使用缓冲的输入和输出流比使用无缓冲的流快几个数量级.然而,真正有趣的事情(至少对我来说)是案例2和3之间的速度差异.一些样本结果如下:
Unbuffered input, unbuffered output
Time: 36.602513585
Buffered input, unbuffered output
Time: 26.449306847
Unbuffered input, buffered output
Time: 6.673194184
Buffered input, buffered output
Time: 0.069888689
Run Code Online (Sandbox Code Playgroud)
对于那些感兴趣的人,代码可以在Github上找到.任何人都可以解释为什么案例2和案例3的时间如此不对称?
我有一个关于Sun JDK中提供的Java编译器"智能"的快速问题.具体来说,是否足够聪明地提前评估出现在for()循环的条件部分中的任何函数,而不是在循环的每次迭代中评估它们?
例如,请考虑以下代码.
// Array of doubles to "hold" the array.
private double matrix[][];
public int getCols() {
// Compute the number of columns in a matrix.
}
public int getRows() {
// Compute the number of rows in a matrix.
}
// Compute the sum of all elements in the matrix.
public double sum() {
double result = 0;
for (int r = 0; r < getRows(); r++) {
for (int c = 0; c < getCols(); c++) { …Run Code Online (Sandbox Code Playgroud) 我刚刚注意到std::listC++中有关该类的一些内容我很好奇.简而言之,它涉及列表迭代器的工作方式.请考虑以下代码:
std::list<int> alist;
alist.push_back(0);
alist.push_back(1);
alist.push_back(2);
Run Code Online (Sandbox Code Playgroud)
显然,这会创建一个包含三个整数元素的列表.我可以定义一个到列表开头的迭代器,并使用它来打印出第一个元素中包含的值,如下所示:
std::list<int>::iterator iter = alist.begin();
std::cout << *iter << std::endl; // Prints "0" to stdout
Run Code Online (Sandbox Code Playgroud)
我觉得有点奇怪的是,如果我现在递减迭代器,它会"循环"并最终指向列表中的最后一个元素:
--iter;
std::cout << *iter << std::endl; // Prints "2" to stdout
Run Code Online (Sandbox Code Playgroud)
这种合理的行为是否被认为是一种双重链接列表?如果列表是循环链接列表,我非常期望迭代器中的类似行为,但我发现这很奇怪.
您过去使用过的迭代器行为是否有任何实际用途?是否有任何与此行为相关的陷阱我应该留意?
(顺便说一句,这发生在gcc 4.7.0(MinGW).我没有用任何其他版本或编译器测试它.)