Более быстрый способ записи массива в консоль? - PullRequest
0 голосов
/ 24 апреля 2020

Я недавно пытался сделать свою собственную версию Game of Life, и она работает, единственная проблема - печать на консоли, если вы запустите ее, вы сможете ясно увидеть, что она пишет слева направо и занимает около 0,3 секунды, и я бы хотел, чтобы он был немного быстрее. Если вы хотите скомпилировать его, просто введите 0 на первом экране.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "console.h"
//#include <conio.h>

#define XSIZE 80 // max 240
#define YSIZE 25 // max 67

int clone(int array1[XSIZE][YSIZE], int array2[XSIZE][YSIZE]);
int print(int array[XSIZE][YSIZE]);
int getrandarray(int array[XSIZE][YSIZE]);
int countNachbar(int x, int y, int array[XSIZE][YSIZE]);
int calccells(int thisarray[XSIZE][YSIZE], int nextarray[XSIZE][YSIZE]);

int choice;

int main()
{
    setCursorType(0);
    srand(time(0));
    initConsole();
    //mode con: cols=XSIZE lines=YSIZE;
    int cells[XSIZE][YSIZE], nextcells[XSIZE][YSIZE] = {};
    int cellgen = 0;
    char c;
    printf("Nachbarmodus?\n1 = Rechteck(Randzellen bleiben immer gleich, stirbt nicht oft aus)\n0 = Torus(Die seiten des rechteckes werden verbunden, um einen Donut\ndarzustellen, der keine raender hat, stirbt oefter aus, ist der Originale Modus)\n");
    scanf("%d", &choice);
    clrscr();
    gotoxy(0, 0);
    getrandarray(cells);
    print(cells);
    while(c != 27)
    {
        calccells(cells, nextcells);                    //memcpy (cells, nextcells, YSIZE*XSIZE*sizeof(int));
        print(nextcells);
        cellgen++;
        gotoxy(0, YSIZE+1);
        printf("Generation %d", cellgen);
        clone(nextcells, cells);
        if(kbhit())
            c = getch();
    }
    return 0;
}

int print(int array[XSIZE][YSIZE])
{
    int x, y;
    for(x=0; x<XSIZE; x++)
    {
        for(y=0; y<YSIZE; y++)
        {
            gotoxy(x, y);
            if(array[x][y] == 1)
                printf("%c", 254);
            else if(array[x][y] == 0)
                printf(" ");
        }
    }
}

int getrandarray(int array[XSIZE][YSIZE])
{
    int x, y;
    for(x=0; x<XSIZE; x++)
    {
        for(y=0; y<YSIZE; y++)
        {
            array[x][y] = rand()%2;
            //array[x][y] = 1;

        }
    }
}

int countNachbar(int x, int y, int array[XSIZE][YSIZE])
{
    int sum=0, i, j, spalte, reihe;
    for(i=-1; i<2; i++)
    {
        for(j=-1; j<2; j++)
        {
            spalte = (x + i + XSIZE) % XSIZE;
            reihe = (y + j + YSIZE) % YSIZE;
            sum += array[spalte][reihe];
        }
    }
    sum-=array[x][y];
    return sum;
}

int clone(int array1[XSIZE][YSIZE], int array2[XSIZE][YSIZE])
{
    int x, y;
    for(x=0; x<XSIZE; x++)
    {
        for(y=0; y<YSIZE; y++)
        {
            array2[x][y] = array1[x][y];
        }
    }
}

int calccells(int thisarray[XSIZE][YSIZE], int nextarray[XSIZE][YSIZE])
{
    int x, y, state, nachbarn;
    for(x=0; x<XSIZE; x++)
    {
        for(y=0; y<YSIZE; y++)
        {
            state = thisarray[x][y];
            nachbarn = countNachbar(x, y, thisarray);
            if(state == 0 && nachbarn == 3)
            {
                nextarray[x][y] = 1;
            }
            if(state == 1 && (nachbarn < 2 || nachbarn > 3))
                nextarray[x][y] = 0;
            if(choice)
            {
                if(x == 0 || x == (XSIZE-1) || y == 0 || y == (YSIZE-1) )
                    nextarray[x][y] = thisarray[x][y];
            }

        }
    }

}


//console.h:
//https://www.mediafire.com/file/124e42w8mzy0o4z/console.h/file
//https://www.mediafire.com/file/89j8f9kf7ndyqp6/console.c/file

1 Ответ

1 голос
/ 24 апреля 2020

Сделав быстрый профиль вашего кода, я обнаружил, что функции, которые занимают больше всего времени, это gotoxy() и printf().

Поэтому я бы рекомендовал вам вызывать их как как можно меньше. Вот список улучшений, которые вы можете использовать:

  • Поскольку сетка начинается с позиции (0, 0), вы можете просто вызвать gotoxy(0, 0); в начале print().
  • Чтобы уменьшить количество вызовов до printf(), вы можете построить одну строку, используя ваш массив. А затем отобразите эту строку одним вызовом функции.
  • Для строк, которые не отформатированы, вы можете использовать puts() вместо printf().
  • В качестве альтернативы, для печати отдельных символов вы можно использовать putc().

Надеюсь, это поможет! :)

...