Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 25.12.2015
Сообщений: 41

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

06.08.2018, 18:20. Показов 3284. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru