为什么这两种元胞自动机算法之间的速度存在巨大差异?

时间:2017-12-08 06:06:37

标签: algorithm performance d cellular-automata

我有一个关于我用D编写的两种细胞自动机算法的问题。

我先写了这个,对速度感到非常失望。尺寸为sizex = 64 sizey = 27,初始随机填充40%,在我相当现代的笔记本电脑上显着延迟约5秒。

(位置是一个结构,有两个整数,分别为x和y,有几种方法可用于不同的计算,而DIR是一个包含8个方块的位置的枚举):

Position[] runCellAutoma(uint sizex,uint sizey,Position[] poslist){   
Position[] newposlist;
uint sy;
bool alive;
while(sy<=sizey){
    for(uint sx;sx<=sizex;++sx){
        int ncount;
        Position checkpos = Position(sx,sy);
        foreach_reverse(Position pos;poslist){               
            if(checkpos == pos){
                alive = true;
            }
            foreach(POS; [EnumMembers!DIR]){
                if(checkpos+POS == pos){
                    ++ncount;
                }
            }               
        }
        if(alive){
            if(ncount >= 2 && ncount <  4 && sx > 0 && sy>0 && sx<sizex && sy<sizey){
                 newposlist ~= checkpos;
            }
        }
        if(!alive){
            if(ncount >= 2 && ncount < 3&&sx>0&&sy>0&&sx<sizex&&sy<sizey){
                newposlist ~= checkpos;                                               
            } 
        }
    }
    ++sy;
}
return newposlist;

我读了一些关于细胞自动机的信息,看起来他们中的许多人都使用了二维阵列的bool。所以我重写了我的算法:

Position[] runCellAutoma2(uint sizex,uint sizey,Position[] poslist){

Position[] newposlist;
bool[][] cell_grid = new bool[][](sizey,sizex);
for(int y;y<sizey;++y){
    for(int x;x<sizex;++x){           
        cell_grid[y][x] = false;            
    }
}
foreach(Position pos; poslist){
    if(pos.y < sizey && pos.x < sizex&&pos.y >=0 && pos.x >= 0){
        cell_grid[pos.y][pos.x] = true;
    }       
}
foreach(y,bool[] col; cell_grid){
    foreach(x,bool cell;cell_grid[y]){
        int ncount;           
        foreach(POS; [EnumMembers!DIR]){
            if(y+POS.y < sizey && x+POS.x < sizex&&y+POS.y >=0 && x+POS.x >= 0){                                    
               if(cell_grid[y+POS.y][x+POS.x]){
                    ++ncount;                                                       
                }                   
            }
        }
        if(cell){
            if(ncount >= 2 && ncount <  4 && x > 0 && y>0 && x<sizex && y<sizey){
                newposlist ~= Position(to!int(x),to!int(y));
            }
        }
        if(!cell){
            if(ncount >= 2 && ncount < 3&&x>0&&y>0&&x<sizex&&y<sizey){
                newposlist ~= Position(to!int(x),to!int(y));                                              
            } 
        }            
    }
}
return newposlist;
}

两者都给我相同的结果,但第二个版本立即使用与第一个版本相同的参数。我想知道为什么第一个比第二个慢得多?

谢谢。

0 个答案:

没有答案