2011-09-15 6 views
2

로컬 복사본을 유지하고 필요한 경우에만 업데이트해야합니다. FUNC는 스레드로부터 안전하지 않습니다 아래 ... 또한 나는 ... CPU 시간의 6 ~ 7 %를 저장할 수 있습니다localtime_r() 캐싱은 그만한 가치가 있습니까?

struct tm* custom_localtime (time_t now_sec) 
{ 

    static time_t cache_sec; 
    static struct tm tms; 

    if (now_sec != cache_sec) { 
     cache_sec = now_sec; 
     localtime_r(&cache_sec, &(tms)); 
    } 

    return(&tms); 
} 

추가 세부 사항을 본 적이 : - 내 애플 3000/초에 호출보다 더 만든다

localtime_r() 내가 당신에게 모든 번호, asc99c와 미르 감사 time_t

의 againt 형식 "2011-12-09 10:32:45"의 타임 스탬프 문자열을 캐시 할 때 저장 적어도 33 %의 CPU 시간을 발견했다.

+2

귀하의 합당한 기준은 무엇입니까? – Jon

+0

로그 작성 등을 위해 localtime_r()을 3000/초 이상 호출하는 시나리오에서 시간을 절약 할 수 있습니다. – SparKot

+1

문제를 저장할 시간이 있다면 수행하십시오. 상관 없으면하지 마십시오. 차이점이 * 당신 *에게 중요한지 어떻게 결정할 수 있습니까? – Jon

답변

1

나는 아마도 귀하의 질문에 3000/s 통화 요금을 언급했을 것입니다! 해. 최근에 현지 시간 약 1,000,000 * 10,000 번을 호출하는 화면의 생성을 프로파일 링했습니다.

중첩 된 루프는 약간의 생각으로 크게 향상되었을 수 있지만, CPU 시간의 약 85 %가 로컬 시간에 사용되었습니다. 단순히 결과를 캐싱하여 10,000 번만 호출하면 페이지 생성 시간의 85 %를 단축 할 수 있었고, 그렇게하면 쉽게 충분히 빠르게 만들 수있었습니다.

1

"정말 필요하지 않은 라이브러리 함수 호출을 피하십시오"는 가치가 있습니다. 나머지는 메모리와 속도 간의 균형입니다.

당신은 이것을 3000 초라고 부르기 때문에 헤더에 static inline으로이 함수를 추가하고 (GCC를 사용하는 경우) 조건부 분기 예측 힌트를 사용하는 것이 좋습니다. "가능성 없음":

if (__builtin_expect(now_sec != cache_sec, 0)) 
관련 문제