프로그램 성능 최적화

1. 이야기    배경: 온라인 스 트림 컴 퓨 팅, 어떤 핵심 모듈 Mario 의 큰 업무 버 전 (입력 데이터 double 가 져 오기) 업그레이드    주: 흐름 식 컴 퓨 팅 의 전형 적 인 패 러 다 임 중 하 나 는 데이터 속 도 를 확정 하지 못 한 사건 흐름 유입 시스템 이 고 시스템 처리 능력 은 반드시 사건 트 래 픽 과 일치 해 야 합 니 다.    이 야 기 는 3 단계 로 나 뉜 다.    1) 접속 후 온라인 으로 신고 하면 마리 오 는 데이터 축적 (처리 능력 이 현재 온라인 트 래 픽 을 만족 시 키 지 못 함) 이 발생 한다.         조사 결과: Mario 에서 처 리 된 데 이 터 는 원 격 데이터 베이스 에 들 어가 야 합 니 다. 처리 스 레 드 는 동기 화 방식 으로 데 이 터 를 원 격 데이터 베이스 에 삽입 해 야 합 니 다. 이런 방식 으로 스 레 드 처리 능력 이 급 격 히 떨 어 집 니 다.         해결: 데이터 기록 디스크, 다른 프로그램 입고    2) 첫 번 째 문제 해결 후 성능 문제 재발         해결: Tcmalloc 사용 (참고:http://blog.csdn.net/yfkiss/article/details/6902269)     3) Tcmalloc 를 사용 한 후 온라인 CPU 떨 림 이 매우 심 하고 일정한 확률 로 프로그램 hang 이 있 음 을 발견         검색 결과: 무 거 운 데이터 개 수 를 구 하 는 알고리즘 은 사전 으로 계산 하고 사전 을 자주 구축 하고 삭제 하여 시스템 이 메모 리 를 자주 신청 하고 방출 하여 cpu 디 더 링 을 초래 합 니 다.         해결: 작은 데이터 에 대해 서 는 O (n ^ 2) 알고리즘 을 사용 하고 빅 데이터 에 대해 서 는 O (n) 알고리즘 을 사용 합 니 다 (http://blog.csdn.net/yfkiss/article/details/6754786)。
2. 원리 프로그램의 성능 최 적 화 는 세 가지 차원 의 일 을 할 수 있다.1) 디자인 2) 알고리즘 & 데이터 구조 3) 코드 는 물론 상기 세 가지 측면 은 일반 프로그래머 가 할 수 있 는 최적화 일 뿐 위 에 구조 도 있 고 아래 에 운영 시스템 과 하드웨어 도 있다.디자인: 개인 적 인 이 해 는 가장 중요 한 부분 입 니 다. 예 를 들 어 데 이 터 는 어떻게 처리 합 니까?다 중 스 레 드 입 니까? 단일 스 레 드 입 니까?다 중 스 레 드 간 에 어떻게 동기 화 합 니까?자물쇠 의 입도 가 얼마나 됩 니까?메모리 풀 을 사용 하 시 겠 습 니까?동기 화 또는 비동기 등 알고리즘 과 데이터 구조: 알고리즘 을 최적화 하면 프로그램의 성능 을 수량 급 으로 비약 시 킬 수 있다.코드 변조: 실행 중인 프로그램 은 전형 적 인 상황 이 있 습 니 다. 20% 의 코드 는 80% 의 운행 시간 을 차지 하고 최적화 의 중심 은 이 20% 의 코드 입 니 다.story 로 돌아 가면 첫 번 째 단계 의 문 제 는 디자인 에 문제 가 생 겼 고 인터넷 상호작용 이 필요 할 때 비동기 방안 을 고려 한 것 이 분명 하 다.두 번 째 단 계 는 tcmalloc 를 사 용 했 습 니 다. 본질 적 으로 디자인, 알고리즘, 코드 여러 측면 에서 메모리 분 배 를 최적화 시 켰 습 니 다. 다만 이 최적화 는 다른 사람 이 해 준 것 입 니 다. 세 번 째 단 계 는 알고리즘 최적화 에 속 합 니 다. 기 존의 알고리즘 은 매우 빠 르 지만 메모리 작업 의 과도 한 비용 을 가 져 왔 습 니 다. 우리 의 응용 에서 데이터 세트 는 99% 가 매우 작 습 니 다 (데이터 세트 평균 크기 는 2). 그래서...작은 데이터 세트 에 대해 서 는 O (n ^ 2) 의 알고리즘 을 사용 하여 빅 데이터 세트 에 대해 서 는 O (n) 의 알고리즘 을 사용 하여 실제 적 으로 매우 효과 적 임 을 증명 합 니 다.그래서 가장 좋 은 알고리즘 은 없고 가장 적합 한 알고리즘 만 있다.
3. 핫 이 슈 코드 1) 정리 프로그램 을 어떻게 찾 아 핫 이 슈 를 찾 습 니까?촌 스 럽 지만 유효 합 니 다. 2) 보조 도구: Google Cpu Profiler 방법 1 은 경험 에 의존 하 는 것 이 많 습 니 다. 보조 도구 인 Google Cpu Profiler 를 간략하게 소개 합 니 다.Google Cpu Profiler 는 google - perftools 의 일부분 (google - perftools 는 Tcmalloc, Heap checkedr, Heap profiler 포함) 으로 사용 이 매우 간단 합 니 다. profiler 라 이브 러 리 연결 및 환경 변수 설정 CPUPROFILE 4. Google Cpu Profiler 를 사용 하여 성능 분석 을 하 는 인 스 턴 스 (사용) LD PRELOAD, 게으름뱅이 법, 재 컴 파일 필요 없 음) code:
환경 변수 설정 
LD_PRELOAD 와 CPUPROFILE.
export "LD_PRELOAD=/home/work/zhouxm/google-perf_1.8.3/lib
/libprofiler.so"
export "CPUPROFILE=/home/work/zhouxm/
google-perf_1.8.3/bin/myprofiler"
주: LDPRELOAD 는 프로그램 이 실행 되 기 전에 우선 불 러 올 동적 링크 라 이브 러 리 를 지정 합 니 다.이 기능 은 주로 서로 다른 동적 링크 라 이브 러 리 의 같은 함 수 를 선택적으로 불 러 오 는 데 사 용 됩 니 다.이 환경 변 수 를 통 해 우 리 는 메 인 프로그램 과 동적 링크 라 이브 러 리 사이 에 다른 동적 링크 라 이브 러 리 를 불 러 오고 정상 적 인 함수 라 이브 러 리 를 덮어 쓸 수 있 습 니 다.이 환경 변 수 는 상당히 위험 하 니 조심해 서 사용 하 세 요.
CPUPROFILE 프로필 러 파일 저장 위치 및 파일 이름 지정
실행:
$./test 10000000 10000  1>/dev/null
PROFILE: interrupts/evictions/bytes =508/228/12704
분석: 1) 텍스트 분석: $. / prof - text. / test. / myprofiler 로 컬 파일 을 사용 합 니 다. / test. 로 컬 파일 을 사용 합 니 다. / myprofiler. 모든 스 택 추적 에서 killpg 를 제거 합 니 다. 총: 508 샘플     149  29.3%  29.3%      149  29.3% __write_nocancel       47   9.3%  38.6%       47   9.3% fwrite       41   8.1%  46.7%       41   8.1% _IO_file_xsputn@@GLIBC_2.2.5       41   8.1%  54.7%       41   8.1% random       33   6.5%  61.2%       33   6.5% std::operator<<       32   6.3%  67.5%       32   6.3% std::basic_ostream::operator<<       29   5.7%  73.2%       29   5.7% std::has_facet       26   5.1%  78.3%       26   5.1% std::num_put::_M_insert_int       15   3.0%  81.3%       15   3.0% std::basic_ostream::sentry::sentry       14   2.8%  84.1%       97  19.1% make_expression       13   2.6%  86.6%       73  14.4% std::num_put::do_put       11   2.2%  88.8%       11   2.2% random_r        9   1.8%  90.6%        9   1.8% strlen        7   1.4%  91.9%        7   1.4% CXXABI_1.3        7   1.4%  93.3%        7   1.4% std::basic_ostream::put        6   1.2%  94.5%      135  26.6% make        4   0.8%  95.3%        4   0.8% _IO_do_write@@GLIBC_2.2.5        4   0.8%  96.1%        4   0.8% _init        4   0.8%  96.9%        4   0.8% std::time_put::put        3   0.6%  97.4%        3   0.6% _IO_file_write@@GLIBC_2.2.5        3   0.6%  98.0%        3   0.6% fflush        3   0.6%  98.6%        3   0.6% std::__numpunct_cache::_M_cache        2   0.4%  99.0%        2   0.4% __gnu_cxx::stdio_sync_filebuf::file        2   0.4%  99.4%        2   0.4% std::basic_ios::widen        2   0.4%  99.8%        2   0.4% std::endl        1   0.2% 100.0%        1   0.2% rand        0   0.0% 100.0%        1   0.2% _DYNAMIC        0   0.0% 100.0%        8   1.6% __bss_start        0   0.0% 100.0%      143  28.1% __libc_start_main        0   0.0% 100.0%      143  28.1% main 2) 그래 픽 분석 $. / pfro - dot. / test. / my profiler > test. dot 는 Graphiz 로 dot 파일 을 엽 니 다.

좋은 웹페이지 즐겨찾기