0 / 0 / 0
Регистрация: 25.12.2015
Сообщений: 41

Ускорение работы программы по записи векторов в текстовый файл

06.08.2018, 18:20. Показов 3167. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,
Имеются два вектора чисел в формате Double. Задача записать их поэлементно через разделители в текстовый файл (CSV).

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


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <ctime>
#include <iostream>
#include <fstream>
#include <vector>
 
int main(int argc, char* argv[])
{
    std::vector<double> X(640);
    std::vector<double> Z(640);
    srand(time(0));
 
//==================================================================================================
//                                участок кода скорость которого требуется увеличить
 
    std::ofstream fout("Data.csv");
 
    for (int j = 0; j < 100; j++)
    {
        for (int i = 0; i < X.size(); i++)
            fout << X[i] << ";";
        fout << std::endl;
 
        for (int i = 0; i < Z.size(); i++)
            fout << Z[i] << ";";
        fout << std::endl;
    }
    fout.close();
//==================================================================================================
 
    std::cout << "runtime = " << clock() / 1000.0 << std::endl; // время работы программы
    system("pause");
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2018, 18:20
Ответы с готовыми решениями:

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

Записать результат работы программы в текстовый файл
uses crt; const max=30; type TStud=record fam:string; oc:arrayof byte; sr:real; ...

Как вывести результаты работы программы в текстовый файл в данной программе?
Разработать программу на языке Pascal. Заданный метод должен быть реализован в виде отдельной подпрограммы. Результаты работы программы...

25
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
08.08.2018, 18:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ymnuhj1 Посмотреть сообщение
1) Я правильно понимаю, что если кол-во элементов будет до 1280, то для этого мне понадобится просто поменять:
Ага. Только каюсь, числа были взяты на глазок, по хорошему надо внести пару поправок:
1) не %f, а %.6e чтоб была экспоненциальная запись в которой сверхбольшие числа не превращаются в простыню текста.
2) Восемь знаков - мантисса (цифра точка шесть цифр), плюс еще шесть показатель степени (E, +-, четыре цифры - показатель), плюс точка с запятой. Того, пятнадцать символов.
Итого - резервируем не 12, а 15 символов на каждое число, плюс один символ под терминальный ноль:
C++
1
2
char buf[сколько выводим чисел*15+1];
sprintf("%.6e;",число);
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
09.08.2018, 04:35
Цитата Сообщение от Max Dark Посмотреть сообщение
оптимизация преобразования double в строку.
std::to_string
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.08.2018, 05:50
Цитата Сообщение от New man Посмотреть сообщение
std::to_string
...Дергает "офигенно быструю" динамическую память для выделения места под строку.
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
10.08.2018, 22:41
С учётом того, что чел выводит в файловый поток, это не хуже.
Я замерял когда-то, to_string точно лучше <<.

Ну, и никто не мешает делать sprintf с заранее выделенным буфером или самому вывод по цифрам сделать.

Добавлено через 20 минут
Надо вот этот код:
C++
1
2
3
4
5
6
7
8
9
10
for (int j = 0; j < 100; j++)
    {
        for (int i = 0; i < X.size(); i++)
            fout << X[i] << ";";
        fout << std::endl;
 
        for (int i = 0; i < Z.size(); i++)
            fout << Z[i] << ";";
        fout << std::endl;
    }
Переписать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::string out;
for(size_t i = 0; i<100; ++i)
{
    for (size_t j = 0; j < X.size(); j++)
    {
            out +=std::to_string(X[j]);
            out += ';';
     }
    out += '\n';
 
    for (size_t j= 0;j < Z.size(); j++)
    {
            out +=std::to_string(Z[j]);
            out += ';';
     }
    out += '\n';
}
std::ofstream ("Data.csv")<<out;
0
 Аватар для lordimid
6 / 5 / 1
Регистрация: 02.10.2011
Сообщений: 111
11.08.2018, 02:23
Цитата Сообщение от New man Посмотреть сообщение
Переписать так:
Странно, но у меня так получается в разы медленнее.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
13.08.2018, 17:26
Вот так быстрее но всего лишь вдвое
C++
1
2
3
4
5
    char Buff[15];
    for (int j = 0; j < X.size(); j++) {
        sprintf(Buff, "%f", X[j]);
        fout.write(Buff, 15);
    }
Для реального ускорения надо определится с тем что именно у тебя за double и в каком конкретно виде они тебе нужны.
В зависимости от ситуации возможны трюки с мантисой и экспонентой или перевод в инт и тому подобные.

Добавлено через 16 минут
Плюс надо очень аккуратно измерять время. В другой похожей задаче где скорость именно записи на диск была слабым звеном... так вот у диска есть буффер какойто хитрый. и при первом выполнении одного и тогоже (десятки метров чтения и записи) программа работала вдвое медленнее чем в последующих если времени прошло немного между запусками и буфер диска не почистился.
Но тут я прикинул слабым звеном является именно перевод double текст.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2018, 17:26

«Вычисление значений функции на заданном отрезке» результаты работы программы записать в текстовый файл;
#include &lt;iostream&gt; #define _USE_MATH_DEFINES #include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; using namespace std; ...

Ускорение работы программы
import time t1 = time.clock() mas = mas1 = mas2 = with open('input.txt', 'r') as inp: n = int(inp.readline().strip()) ...

Ускорение работы программы
Написал программу для РГР по Компьютерной геометрии и графике. Парсит файл типа *.obj (wavefront) и рисует на picturebox. Проблема в том,...

Ускорение работы программы
доброго времени суток. Возникла следующая проблема: using System; using System.Collections.Generic; using System.Diagnostics; ...

Ускорение работы программы
Добрый день. мне необходима помощь в пересмотре кода. Требуется ускорение обработки данных архив. Рассматриваю любые предложения. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru