daniel00   6년 전

오늘 어떤 문제를 풀다가 갑자기 궁금한게 생겨서요.

쿼리를 30만개 하는문제가 있는데 , 각 쿼리마다 printf()로 답을 출력 하라고 하네요.

알고리즘을 차치하고라도 , 실제로 io에 접근하는 시간이 무척 큰데요

judge시스템에서는 실제로 프린트된 값을 어떻게 확인하는걸까요?

그리고 이런경우 어떻게하면 출력 시간을 단축할 수 있을까요?

여러분들의 의견을 듣고 싶습니다.

수고하세요.

chogahui05   6년 전

30만개요? 무리 없이 할 거 같습니다..만.

버퍼를 하나 만들어 놓고 출력해 보는 것도 나쁘진 않을 듯 싶네요.

daniel00   6년 전

답변 감사드립니다.

무리없이 출력될거라고 말씀해주신거 보면 제가 무언가 잘못 생각하고 있다는 생각이 드네요...

일단 아래와 같은 코드로 printf()를 수행해보면 콘솔에 출력하는데에만 약23초정도가 소요되네요.

Judge 시스템에서도 콘솔과 같은 장치를 이용한다면 똑같지 않을까 싶어서요.

버퍼를 만들어 출력해보라는 말씀을 조금더 구체적으로 설명해주실수 있으신가요? 한번 테스트해보고 싶네요.

감사합니다.

#include <iostream>
#include <cstdio>
#include <time.h>

using namespace std;

int main()
{
int start = clock();
const int max_num = (int)3e5;

for (int i = 0; i < max_num; i++)
{
printf("%d ", i);
}

printf("Elapsed Time : %d ms\n", clock() - start);

return 0;
}


chogahui05   6년 전

버퍼를 만들어 보라는 건 별 게 없고요.

char buffer[1000000] = {0};

이렇게 만들어 놓고, 버퍼가 차기 직전까지 buffer에 쓴 다음에 출력.

다시 버퍼 시작부터 버퍼가 차기 직전까지 buffer에 쓴 다음 출력..

이런 식입니다.


문자열의 길이만 구할 수 있다면

버퍼에 쓰는 위치만 옮기기만 하면 됩니다.

daniel00   6년 전

답변 감사합니다.

sprintf() 등으로 버퍼에 출력하고 , 그 다음에 printf()로 버퍼에 있는 데이터를 출력하시라는 말씀으로 이해했는데 제가 맞게 이해했는지 모르겠습니다.

근데 , sprintf()로 출력하면 그 시간은 굉장히 많이 주는걸 확인했는데요 역시나 printf()를 수행하는 과정에서 시간이 많이 소요되네요.

혹시 버퍼의 데이터를 printf()로 한꺼번에 출력하는 특별한 방법이 있는건가요? 테스트는 문자열의 크기를 가지고 루프를 돌며 출력했습니다.

조언 부탁드리겠습니다.




chogahui05   6년 전

printf("%s\n",buffer);

이렇게 해도 오래 걸릴려나요??

daniel00   6년 전

아래의 코드로 테스트해보면 릴리즈모드에서 약 1600~1900ms 을 왔다갔다하며 출력되네요.

이정도가 최선인걸까요?


#include <iostream>
#include <cstdio>
#include <time.h>
#include <string.h>

using namespace std;

int main()
{
int start = clock();
const int max_num = 300000;

char* buff = new char[max_num * 7+1]; //7 = 6 digit(1~300000) + space(0x02), 1=null string
memset(buff, 0, sizeof(char)*max_num * 7+1);

for (int i = 0; i < max_num; i++)
{
sprintf(buff+7*i, "%06d ", i);
}
printf("%s\n", buff);

printf("Elapsed Time : %d ms\n", clock() - start);

return 0;
}



daniel00   6년 전

아래 코드처럼 sprintf()의 리턴값을 이용해서 조금더 최적화 했더니 30만개 출력시 1600ms 정도나오네요.

근데, 문제 1999번의 출력방법만 K개의 쿼리별로 각각printf()하는것과,  

sprintf()로 K개의 결과값을 모두 버퍼에 모아서 한방에 출력하는 방법으로 테스트해봤는데

Judge 시스템에서 출력해주는 시간은 108ms으로 정확히 동일하네요.....

Judge에서의 printf() 처리가 점점더 궁금해집니다. printf()에 의한 딜레이를 감안해서 판정을 하는건지 아닌지.....


#include <iostream>
#include <cstdio>
#include <time.h>
#include <string.h>

using namespace std;

int main()
{
int start = clock();
const int max_num = 300000;

char* buff = new char[max_num * 7+1]; //7 = 6 digit(1~300000) + space(0x02), 1=null string
memset(buff, 0, sizeof(char)*max_num * 7+1);

int len = 0;
for (int i = 0; i < max_num; i++)
{
len += sprintf(buff+len, "%d ", i);
}
printf("%s\n", buff);

printf("Elapsed Time : %d ms\n", clock() - start);

return 0;
}


댓글을 작성하려면 로그인해야 합니다.