2011-12-02 4 views
2

Ruby로 작성된 코드 조각에 관한 최적화 아이디어를 찾고 있습니다. (GCC에 의해 생성 된) 종속 파일에서 헤더 파일 종속성을 찾습니다.Ruby - GCC 의존성 파일 구문 분석 최적화

Ruby 프로파일 러를 실행했으며 대부분의 CPU 시간이 아래의 각 함수에서 소비 된 것으로 나타났습니다. GCC의 -M 옵션에 의해 지정된

lines = File.readlines(depends_file) 
lines.each do |line| 
    if line.include?(".h") then 
    line.lstrip.rstrip.chomp("\\").split(' ').each do |line| 
     header_dependencies << line 
    end 
    end 
end 

(가) 달려 파일은 메이크 규칙 형식의 종속성을 포함, GCC's Preprocessor Options를 참조하십시오. 내 프로젝트의 예는 다음과 같습니다. -

CyclicRedundancyCheck.o: src/CyclicRedundancyCheck.c \ 
inc/CyclicRedundancyCheck.h inc/StdDefs.h 

대체로 많이 최적화 된 솔루션을 게시 할 수 있습니까?

답변

2

무겁게 최적화되지하지만 조금 더 빨리 여기 (내 테스트의 경우 약 20 %) :

File.open(depends_file, 'r') do | io | 
    io.each do |line| 
    next unless line.include?('.h') 
    header_dependencies.concat(line.split) 
    end 
end 
header_dependencies.delete('\\') 

난 당신이 훨씬 더 루비 자체 얻을 수 있다고 생각하지 않습니다. 이것이 너무 느리다면 C로 (부분적으로) 프로그래밍하는 것을 고려해야합니다 (확장으로).

이 접근법은 튼튼하지 않습니다. 예 :

foo.o: src/ext.hlib/foo.c \ 

이 잘못 일치합니다. 더 견고 해지면 비용 대비 성능이 향상 될 것입니다.

+0

답변 해 주셔서 감사합니다. 나에게 내가 기대했던 성능 향상을주지는 못했지만, 내 것보다 더 우아한 해결책이다 :) – thegreendroid

0

Regex 기반 솔루션은 @ undur_gongor의 솔루션보다 빠른 (약 5 %) 터치입니다.

header_dependencies = Set.new 
lines = File.readlines(depends_file) 
lines.each do |line| 
    header = line.match('[\w\/-]+\.h') 
    header_dependencies.add(header.to_s) unless header.nil? 
end 

언급 된 @undur_gongor와 동일한 결함이 있지만 그 것이 내가 살 수있는 것입니다.