Ruby - оптимизация разбора файла зависимостей GCC - PullRequest
2 голосов
/ 02 декабря 2011

Я ищу идеи по оптимизации, касающиеся приведенного ниже фрагмента кода, написанного на Ruby.Он ищет зависимости файла заголовка в файле зависимостей (сгенерированном GCC с использованием gcc -M -MM -MF)

Я запустил профилировщик Ruby и обнаружил, что большая часть времени процессора тратится в массиве # каждой функции ниже.

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

Файл зависимостей содержит зависимости в формате правила make-файла, как указано параметром -cc для gcc, см. Параметры препроцессора GCC .Вот пример из моего проекта -

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

Может кто-нибудь опубликовать альтернативное, сильно оптимизированное решение?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Не сильно оптимизировано, но немного быстрее (около 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('\\')

Я не думаю, что вы можете получить намного больше с самим Ruby.Если это действительно слишком медленно, вам следует подумать о программировании его (частично) на C (как расширение).

Обратите также внимание, что этот подход далеко не надежен.Например,

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

будет ошибочно сопоставлено.Однако повышение его надежности, скорее всего, приведет к снижению производительности.

0 голосов
/ 08 декабря 2011

Решение на основе Regex на ощупь быстрее (около 5%), чем решение @ undur_gongor.

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, но с этим я могу жить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...