2016-06-06 2 views
2

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

Функция у меня есть это:

vector <double> extract (vector <double> foo) 
{ 
    ifstream wlm; 
    wlm.open("wlm.dat"); 

    if(wlm.is_open()) 
    { 
     while (!wlm.eof()) 
     { 
      //blah blah extraction stuff 
     } 
     return foo;  
    } 
    else 
     cout<<"File didn't open"<<endl; 
    wlm.close(); 
} 

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

+1

Почему вы спрашиваете нас? Купите себе секундомер и измерьте. –

+0

Данные, которые вы читаете из файла, меняются от запуска до запуска? Или это статично? – Alex

+0

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

ответ

1

Хотя ваш вопрос не совсем понятно, я предполагаю, что вы хотите:

  • вычислить вектор двойников из большого набора данных
  • использовать этот вычисленный (меньший) набор данных в вашей программе
  • делать вычисления во время компиляции

Возможно, это возможно, но вам придется использовать любую систему сборки, которую вы используете. Без дополнительной информации я могу дать только общий ответ:

  1. Создайте вспомогательную программу, которую вы можете вызвать во время компиляции. Эта программа должна реализовать функцию extract и вывести результат в файл. Здесь у вас есть два основных варианта: перейти к файлу ресурсов, который может быть встроен в исполняемый файл, или генерировать исходный код, содержащий данные. Если данные не очень большие, я предлагаю их.

  2. Используйте созданный файл в программе

Например:

Предварительная сборка шагextract_data.exe extracted_data_generated

Это отвалы извлеченные данные в заголовок и источника, например, :

// extracted_data_generated.h 
#pragma once 
extern const std::array<double, 4> extracted; 

// extracted_data_generated.cpp 
#include "extracted_data_generated.h" 
const std::array<double, 4> extracted{ { 1.2, 3.4, 5.6, 6.7 } }; //etc. 

В других частях вашей программы, используйте сгенерированные данные

#include "extracted_data_generated.h" 

// you have extracted available as a variable here. 

Я также изменил к std::array, размер которого вы будете знать, в вашем помощнике программе, потому что вы будете знать размер вектора.

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

+0

Спасибо! Это именно то, что я искал. В настоящее время для выполнения этой функции требуется около минуты, и она будет увеличиваться только тогда, когда я начну работать с большими файлами. Ваш ответ действительно помогает! Я буду обновлять, если/когда я могу заставить его работать, или если у меня есть проблема. Что я должен изменить в своей формулировке вопроса, так что для других, кто видит этот вопрос, более ясно? – pyroscepter

+0

@pyroscepter Я рад, что это помогло. Я думаю, что если вы включите мои предположения в вопрос и удалите последний абзац, это будет намного яснее. –

2
  1. Измените функцию, что:

    std::vector<double>& extract(std::vector<double>& foo) 
    

Таким образом, вы не будете копировать вектор в два раза (я предполагаю, что съедает большую часть времени).

  1. Пробуйте reserve() Память для вашего вектора в соответствии с файлами (если это возможно, это позволит избежать перераспределения).
  2. Вы должны вернуть std::vector<double> всегда, а не только в случае хорошего результата.
  3. Вы должны закрыть файл, только если он был успешно открыт.

Нечто подобное:

std::vector<double>& extract (std::vector<double>& foo) 
    { 
     ifstream wlm; 
     wlm.open("wlm.dat"); 

     if(wlm.is_open()) 
     { 
      while (!wlm.eof()) 
      { 
      //blah blah extraction stuff 
      } 
      wlm.close(); 
     } 
     else 
      cout<<"File didn't open"<<endl; 

     return foo;  
    } 
+0

Это нормально, я думал об этом (и внесет соответствующие изменения), но проблема в том, что я не хочу запускать эту функцию с основной программой, потому что размер файла огромен (несколько концертов). Есть ли способ, которым я могу запустить эту функцию один раз, получить вектор, а затем использовать этот вектор с основной программой на C++? Это то, что я хотел спросить. Извините за то, что вы недостаточно. – pyroscepter

+0

Как и в случае нескольких вызовов программы? Нет, даже если вы должны были добавить данные непосредственно в скомпилированный исполняемый файл, вам все равно придется создавать вектор из данных, и этот шаг, скорее всего, связан с дисковым вводом-выводом, а не с привязкой к ЦП. – OmnipotentEntity

+0

@pyroscepter Если программе требуется несколько гидов данных, тогда она должна получить эти данные откуда-то, нет? Сохраняя данные в файле, вы вычисляете его только один раз. Если коэффициент ограничения производительности читает файл, то вы должны искать способы хранения данных в меньшем пространстве, чтобы было меньше данных. Какой формат файла? Насколько это компактно? –

Смежные вопросы