我想对运行在文件上的算法进行基准测试。该算法迭代N轮,并且在每一轮中,它读取一个数据块,做一些神奇的东西并设置下一个块的偏移量。
这是伪代码:
int run_algorithm(int offset) {
char *fname = "database.dat";
fd = open(fname, O_RDONLY);
// read the desired block to memory
block_size = 1024 * 1024;
char *buf = malloc(block_size);
lseek(fd, offset, SEEK_SET);
read(fd, &buf, block_size);
int new_offset;
// do magic stuff with buf
// and set a new offset
close(fd);
return new_offset;
}
int main() {
int i;
//init offset
int offset = 0;
// iterate N times
for (i = 0; i < N; i++) {
offset = run_algorithm(offset);
}
return 0;
}
我知道操作系统有热缓存和冷缓存。我想实现冷缓存案例。在每次run_algorithm()调用中,文件打开时都不应该有缓冲。换句话说,我不希望操作系统将文件的一部分存储在内存中以加速open()和seek()。
有没有办法专门设置open()和seek()而不进行缓冲?
答案 0 :(得分:3)
您无法在硬盘和操作系统中禁用alll缓存。
但如果您接受对程序之外的所有内容进行基准测试,那么您可以在C运行时库中禁用缓冲:
package facecomponent;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
/**
*
* @author HelenPeng
*/
public class FaceComponent extends JComponent {
public static void main(Graphics g) {
Graphics2D g2= (Graphics2D)g;
Ellipse2D.Double interestingEmoji = new Ellipse2D.Double(0,0,100,100);
g2.draw(interestingEmoji);
Ellipse2D .Double eye1 = new Ellipse2D.Double(25,25,10,10);
Ellipse2D .Double eye2 = new Ellipse2D.Double(50,25,10,10);
g2.draw(eye2);
g2.draw(eye1);
Line2D.Double mouth = new Line2D.Double(35,75,75,75) ;
g2.draw(mouth);
}
}
您必须在fopen操作后立即调用该函数。请参阅cpp reference page。
中的详细信息