assert와 성능

  • sven
    sven

    TPATH 를 해결하고 코드를 최적화시키는 중에 흥미로운 사실을 발견했습니다.
    while 문에 무한루프가 확실히 방지되도록 assert 문을 넣어놓았었는데, 최적화를 위해 이 부분을 제거하니 오히려 속도가 느려지더군요.
    여러 번 재채점을 해보았지만 일관성있게 그런 결과를 보여줍니다.
    로우 레벨에서 제가 모르는 기작이 있는 것 같은데, 왜 그런걸까요?


    11년 전
10개의 댓글이 있습니다.
  • hyunhwan
    hyunhwan

    10ms 정도 가량의 차이는 채점 서버의 여러 문제등으로 인해서 발생할 수 있습니다. 동일한 코드를 제가 다시 채점 해봤을때는 399ms가 나오네요. assert의 문제는 아니라고 봅니다.


    11년 전 link
  • sven
    sven

    아래는 각 5회의 실험 결과입니다.
    assert 있는 경우 (ms)
    407, 429, 415, 380, 413
    평균 408.8

    assert 없는 경우 (ms)
    438, 455, 401, 457, 434
    평균 437

    일관성있게 30ms 가량 차이가 나는데, 단순한 오차로 치부하기는 힘들다고 생각합니다. 좀 더 돌려보지요.


    11년 전 link
  • hyunhwan
    hyunhwan

    제가 본 것은 sven님의 120964번과, 120965번 소스인데 맞는지요?

    저 소스는 단순히 assert만의 차이가 있는게 아니라, http://www.diffnow.com/?report=qpo3b 다음과 같이 hasPath 함수 바로 아래에

    if(min > max)
        return false;
    

    본 부분이 빠져있고 아닌 차이도 있습니다만, 제가 399ms가 나왔다고 하는 것은 12964번 코드에 assert만 지운 경우입니다.


    11년 전 link
  • sven
    sven

    assert 쓴 경우
    443, 411, 421, 404, 455 (ms)
    426.8 (ms)

    assert 없는 경우
    431, 438, 434, 414, 482 (ms)
    439.8 (ms)


    11년 전 link
  • sven
    sven

    LiBe // 아닙니다. 저는 비교를 위해 120966번과 120967번 코드를 사용했습니다.
    http://algospot.com/judge/submission/detail/120966
    http://algospot.com/judge/submission/detail/120967


    11년 전 link
  • sven
    sven

    차이는 assert 의 유무 뿐입니다.
    diff a.cpp b.cpp
    120a121,122
    assert(head <= N);
    assert(tail <= N);


    11년 전 link
  • hyunhwan
    hyunhwan

    그리고 전 LiBe라고 쓰는게 아니라 LIBe라고 쓰는걸 좋아한답니다. 뭐 이건 여담이고, 저도 다시 돌려보니 뭔가 이상하긴 합니다. assert 없는 쪽이 보통 느린 수행시간을 보여주는군요.

    수행 결과는 지금 algospot의 결과인지 아니면 로컬에서 돌린 결과인지 궁금합니다.


    11년 전 link
  • sven
    sven

    LIBe // 다음부터는 신경쓰도록 하지요. 지금 algospot 에서 돌린 결과입니다. 서버의 일시적인 성능의 차이가 최대한 덜 반영되도록, 모든 실행을 번갈아가며 진행했습니다.


    11년 전 link
  • hyunhwan
    hyunhwan

    방금 assert에서 head 검사 부분을 주석처리하고 tail 부분만 그대로 두고 돌려봤는데 이 때의 결과는 assert를 지운 것과 엇비슷한 결과를 보이네요. http://algospot.com/judge/submission/detail/120972

    뭔가 제대로 아는 바는 없지만 caching의 문제가 아닐련지 추측해봅니다.


    11년 전 link
  • sven
    sven

    그렇군요. 친구 말을 들어보니 assert 로 확보된 부분을 이용하여 컴파일러 레벨에서 최적화를 더 잘 하는 것 같다는 의견도 있네요. (캐시의 이용을 포함하여) 아무튼 앞으로 assert 를 애용해야겠네요.


    11년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.