Включение Legacy-C C ++ - PullRequest
       17

Включение Legacy-C C ++

0 голосов
/ 03 октября 2009

В настоящее время я работаю над критичным к производительности приложением, которое включает старый код c (вариант SPICE).

Проблема заключается в следующем:

Создатели унаследованного кода c, по-видимому, полагали, что использование Передача аргументов - одно из величайших бед современности. Таким образом, около 90% из всех переменных были объявлены глобально.

Устаревший код должен вызываться повторно для целей моделирования, и было бы очевидно, что использование потоков для одновременных вызовов этого раздела кода будет полезным для общего времени выполнения.

Моя идея заключалась в том, чтобы инкапсулировать унаследованный код c (который я уже немного изменил для компиляции g ++), чтобы можно было создать несколько объектов для унаследованного кода, устраняя необходимость во многих мьютексных блокировках. Очевидно, что глобальные переменные, таким образом, будут инкапсулированы как переменные-члены.

Это принесло еще одну проблему на стол. Устаревшие кодеры также не верили в инициализацию глобальных переменных; вероятно, поскольку C склонны инициализировать глобальные переменные в 0. Переменные-члены C ++ не сшиваются, чтобы получить ту же обработку, хотя. Несколько переменных должны быть инициализированы в 0 для правильной работы устаревшего кода c. Но найти эти переменные оказалось довольно сложно из-за огромного количества используемых глобальных переменных.

Пожалуйста, имейте в виду, что время не позволяет мне модифицировать устаревший код c для любых основных степень.

У меня следующие вопросы:

  1. Я прав в предположении, что инкапсуляция кода C будет быстрее чем использовать около 90 мьютексных замков?

  2. Существует ли простой способ найти использование неинициализированной переменной-члена? (Как я понимаю, gcc может делать это только для автоматических переменных). Чтобы я мог инициализировать только критические переменные?

  3. Если нет, вопрос 2 ... существует ли быстрый и понятный способ инициализации всех переменных-членов без использования обычного метода init конструктора?

  4. Или (длинный выстрел) есть ли быстрый способ следить за ходом программы, чтобы я мог включить передачу аргумента самому себе?

Любая помощь будет высоко оценена. Нотабене

Ответы [ 3 ]

3 голосов
/ 03 октября 2009
  1. Да. Если вы можете поместить состояние в объекты, на которые вы передаете указатели, это будет быстрее, чем блокировка, при условии, что вы действительно используете потоки.
  2. Нет, нелегко найти переменные-члены в унифицированном виде. По сути, для этого потребуется выполнить анализ всего кода, чего он обычно не может сделать (из-за наличия библиотек)
  3. Если вы помещаете все данные в структуру старого стиля (то есть, нет методов, нет объявлений доступа), вам разрешается memset () всей структуры обнулять. Это приведет к инициализации так же, как инициализируются глобальные переменные (что C гарантирует инициализацию - в ноль).
  4. Если по-быстрому вы имеете в виду «автоматический», то ответ, вероятно, «нет».
1 голос
/ 04 октября 2009

Если вы собираетесь использовать несколько потоков, вам необходимо либо устранить, либо заблокировать данные, которые используются совместно между потоками. Создание старого, не ориентированного на многопотоковое исполнение кода будет означать много работы и много отладки. Если у вас нет много времени, чтобы покопаться в унаследованном коде, я бы не стал пытаться. Вы открываете огромную банку с червями.

  • Вы можете обеспечить начальные значения 0 для глобальных переменных в g ++ с помощью -fno-common. См. Руководство по gcc.

  • Я думаю, что вам гораздо лучше следовать предложению использовать несколько процессов, а не несколько потоков. Каждый процесс имеет свое собственное адресное пространство, и вам не нужно ничего трогать в устаревшем коде. Я бы очень старался найти способ разложить вашу проблему на уровне процесса. (например, не делайте это для каждого вызова, делайте это масштабно для логически независимых частей проблемы: например, пакетов по 1000 каналов одновременно.)

  • Прежде чем приступать к оптимизации, очень внимательно посмотрите, почему он медленный. Создание параллельного существующего последовательного кода - очень тяжелая работа для потенциально ограниченной выгоды. Вы уверены, что это то, что вы хотите сделать.

С уважением, Matt

0 голосов
/ 03 октября 2009

Вы думали о том, чтобы просто использовать форк, а не делать сенсацию? Казалось бы, это потребует очень небольших изменений в коде, и если вы не попытаетесь провести много анализов очень маленьких моделей, это может оказаться не слишком затратным с точки зрения производительности.

...