如何优化打印大块文本?

问题描述 投票:0回答:1

所以我正在构建一个项目,创建一个代表冒泡排序算法的图,但是,我所做的方法非常慢,并且像重新组织具有一百个位置的向量需要大约 3 分钟。这是实现:

void bubbleSort(int vet[]) { // Implementation of the bubble sort algorithm
    int i, aux, troca;

    do {
        troca = 0;,
        
        for (i = 0; i < VET_SIZE - 1; i++) { 
            createGraphic(vet);
            if (vet[i] > vet[i+1]) {
                aux = vet[i];
                vet[i] = vet[i+1];
                vet[i+1] = aux;
                troca = 1;
            }
        }
    } while (troca);
}


void createGraphic(int vet[]) { // Drawing the graphic
char graphic[VET_SIZE * (VET_SIZE * GRAPHIC_LENGHT + 1) + 1]; 
    int i, j, k;

    system("cls"); 

    for (i = 0; i < VET_SIZE; i++) {
        for (j = 0; j < VET_SIZE; j++) {
            if (vet[j] - i > 0) {
                graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT] = '#';
                for(k = 1; k <= GRAPHIC_LENGHT + 1; k++) { // Depending of the value of GRAPHIC LENGHT this part of the code print ' ' to give some spaces between he bars 
                    graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT + k] = ' ';
                }
            } else {
                graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT] = ' ';
                for(k = 1; k <= GRAPHIC_LENGHT + 1; k++) {
                    graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT + k] = ' ';
                }
            }
        }
        graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + VET_SIZE * GRAPHIC_LENGHT] = '\n';
    }

    graphic[VET_SIZE * (VET_SIZE * GRAPHIC_LENGHT + 1)] = '\0';
    printf(GREEN "%s", graphic);
}

首先,我尝试仅逐个字符地打印图形,但我发现它非常慢,然后我将图形放入矢量中并将所有内容打印在一起,这有点快,但仍然不是我想要的。有人可以帮我调整一些工具或代码,使图形立即显示或比当前实现更快吗?

c performance sorting optimization bubble-sort
1个回答
0
投票

首先可以解决的问题是:

  1. 使数组“图形”非VLA(大小在编译时已知),并使其全局或静态。

  2. 如果您还没有这样做,请使用 -O2 进行编译。

  3. 不要使用“系统”函数 - 将这 3 个字节放在数组的开头 - “c”。它有效地执行相同的操作(如果您使用 gnu/linux),但没有“系统”调用的开销。 “系统”调用基本上是在下面调用 fork - 每次迭代都这样做并不是一个好主意。

  4. 摆脱 printf 并使用“write”系统调用直接输出缓冲区。可能不是那么有效,但值得一试。

但最有效的方法当然是重新考虑算法。

还有,那个逗号是怎么回事?

troca = 0;,
© www.soinside.com 2019 - 2024. All rights reserved.