Итак, это одна из наших лабораторий в Computer Systems Architecture, в которой мы должны проиллюстрировать процесс кеша (ArrayList of string) работы с основной памятью ( 2-мерный массив int) каждый [i] [j] из этого содержит 4 элемента типа int (голубой, пурпурный, желтый, черный) класса Color.Следовательно, we must show number of hits, misses, hit/miss-ratio and total accessed array cells
.
В моей функции boolean cacheCheck()
есть ошибка, она никогда не возвращает true!Искал ошибки часа, моя воля стала слабой, Помогите мне! XD`
моя функция:
public static boolean cacheCheck(int i, int j, int color, ArrayList<String>
cache){
boolean Check = false;
if(cache.size() >= 3) {
String firstElement = cache.get(cache.size()-3);
secondElement = cache.get(cache.size()-2);
String thirdElement = cache.get(cache.size()-1);
if(firstElement.equals(String.valueOf(i)) &&
secondElement.equals(String.valueOf(j))){
if(thirdElement.equals(String.valueOf(mainMemory[i][j].c)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].m)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].y)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].k)))
Check = true;
}
}
return Check;
}
полный код Java
package cacheprocess;
import java.util.ArrayList;
import java.util.Scanner;
public class CacheProcess {
public static Color[][] mainMemory;
public static ArrayList<String> Cache = new ArrayList<>();
public static void main(String[] args) {
}
public static void init(){
int N,M,K;
float mRate, hRate;
Scanner s = new Scanner(System.in);
int algorithmNum;
do {
System.out.println("Enter N");
N = s.nextInt();
System.out.println("Enter M");
M = s.nextInt();
} while (!(((M*N)%2) == 0));
do {
System.out.println("Enter number of K blocks :");
K = s.nextInt();
} while (!((K%2) == 0) && K > (N * M / 4));
do {
System.out.println("Choose algorithm:");
algorithmNum = s.nextInt();
int [] h;
switch(algorithmNum) {
case 1:
h=Algorithm1(N,M,K);
break;
//case 2:
// h=Algorithm2(N,M,K);
// break;
// case 3:
// h=Algorithm3(N,M,K);
// System.out.println("Y Total: " + h[3]);
// System.out.println("Y Miss: " + h[4]);
//break;
default:
h=Algorithm1(N,M,K);
break;
}
mRate=(float)h[1]/(float)h[0];
hRate=(float)h[2]/(float)h[0];
System.out.println("Total access: " + h[0]);
System.out.println("Miss: " + h[1]);
System.out.println("Hit: " + h[2]);
System.out.println("Miss Rate: " + mRate);
System.out.println("Hit Rate: " + hRate +"\n\n");
}while(true);
}
public static int [] Algorithm1(int N,int M, int K){
int[] result = new int[3];
mainMemory = new Color[N][M];
int miss = 0, totalAccess = 0, cellsFilled = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
mainMemory[i][j] = new Color();
mainMemory[i][j].c = 0;
mainMemory[i][j].m = 0;
mainMemory[i][j].y = 1;
mainMemory[i][j].k = 0;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
Cache.add( String.valueOf(i) + String.valueOf(j)+ mainMemory[i][j].c);
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
Cache.add(String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].m);
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
Cache.add((String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].y));
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
Cache.add((String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].k));
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
}
}
result[0]=totalAccess;
result[1]=miss;
result[2]=totalAccess-miss;
return result;
}
public static boolean cacheCheck(int i, int j, int color, ArrayList<String>
cache){
boolean Check = false;
if(cache.size() >= 3) {
String firstElement = cache.get(cache.size()-3);
secondElement = cache.get(cache.size()-2);
String thirdElement = cache.get(cache.size()-1);
if(firstElement.equals(String.valueOf(i)) &&
secondElement.equals(String.valueOf(j))){
if(thirdElement.equals(String.valueOf(mainMemory[i][j].c)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].m)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].y)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].k)))
Check = true;
}
}
return Check;
}