gpt4 book ai didi

c++ - 将c++ getline文件输出复制到字符串时的更改

转载 作者:行者123 更新时间:2023-12-02 10:28:36 24 4
gpt4 key购买 nike

我有一个文件,它的每一行都有一行矩阵,并且在每一行中,两个数字之间有空格,这个文件包括很多这些矩阵,它们之间有一个空行
现在我有两个不同版本的代码:
1-使用getline(file,readLine)从文件中读取单线程并直接处理readLine,将其拆分并使用stod生成双数并生成矩阵

#include <fstream>
#include <string>

using namespace std;

void decomposeSerial(double *A, long n)
{
long i, j, k;
for (k = 0; k < n; k++) {
for (j = k + 1; j < n; j++)
A[k*n + j] = A[k*n + j] / A[k*n + k];

for (i = k + 1; i < n; i++)
for (j = k + 1; j < n; j++)
A[i*n + j] = A[i*n + j] - A[i*n + k] * A[k*n + j];
}
}

void main() {
const string inFilePath = ".\\data_in\\file.txt";
const string outFilePath = ".\\data_out\\file.txt";
ifstream inFile(inFilePath);
ofstream outFile(outFilePath);
int n;
int matrixLine = 0;
double * matrix = NULL;
string readLine;
while (getline(inFile, readLine)) {
if (!readLine.empty()) {
if (matrixLine == 0) {
n = 0;
string temp = readLine;
size_t pos = 0;
while ((pos = temp.find(" ")) != string::npos) {
temp.erase(0, pos + 1);
n++;
}
matrix = (double *)malloc(sizeof(double) * n * n);
}
size_t pos = 0;
string token;
int i = 0;
while ((pos = readLine.find(" ")) != string::npos) {
token = readLine.substr(0, pos);
matrix[matrixLine * n + i] = stod(token);
readLine.erase(0, pos + 1);
i++;
}
matrixLine++;
if (matrixLine == n) {
decomposeSerial(matrix, n);
double det = 1;
for (long o = 0; o < n; o++) {
det *= matrix[o * n + o];
}
outFile << det << "\n";
}
}
else {
matrixLine = 0;
}
}
inFile.close();
outFile.close();
}
http://codeshare.io/5enk9x
2-使用getline(file,readLine)从文件中读取单个线程,并将readLine附加到专用于此矩阵的字符串数组的元素中,此后,每个线程并行地获得这些元素之一,并通过相同的过程进行处理制作矩阵
#include <fstream>
#include <string>
#include <omp.h>

using namespace std;

double det[1000];
string input[1000];
int ns[1000];

void computation(double* src, int n, int l)
{
long i, j, k;
for (k = 0; k < n; k++) {
for (j = k + 1; j < n; j++)
src[k*n + j] = src[k*n + j] / src[k*n + k];

for (i = k + 1; i < n; i++)
for (j = k + 1; j < n; j++)
src[i*n + j] = src[i*n + j] - src[i*n + k] * src[k*n + j];
}
double res = 1;
for (int j = 0; j < n; j++) {
res *= src[j*n + j];
}
det[l] = res;
}

void main() {
const string inFilePath = ".\\data_in\\file.txt";
const string outFilePath = ".\\data_out\\file.txt";
ifstream inFile(inFilePath);
int matrixCount = 0;
bool inMatrix = false;
string readLine;
int dim = 0;
while (getline(inFile, readLine)) {
dim++;
if (readLine.empty()) {
ns[matrixCount] = dim - 1;
dim = 0;
inMatrix = false;
matrixCount++;
}
else {
if (inMatrix == false) {
inMatrix = true;
input[matrixCount] = readLine;
}
else {
input[matrixCount] += readLine;
}
}
}
ns[matrixCount] = dim;
matrixCount++;
inFile.close();
#pragma omp parallel
{
#pragma omp for schedule(dynamic)
for (int i = 0; i < matrixCount; i++) {
string matrixStr = input[i];
int n = ns[i];
double * matrix = (double *)malloc(sizeof(double) * n * n);
size_t pos = 0;
string token;
int k = 0;
while ((pos = matrixStr.find(" ")) != string::npos) {
token = matrixStr.substr(0, pos);
matrix[k] = stod(token);
matrixStr.erase(0, pos + 1);
k++;
}
computation(matrix, n, i);

free(matrix);
}
}
ofstream outFile(outFilePath);
for (int i = 0; i < matrixCount; i++) {
outFile << det[i] << "\n";
}
outFile.close();
}
http://codeshare.io/ad83Yy
但令人难以置信的是,第二个代码在制作矩阵时的工作要慢得多
当我使用readf打印readLine来自getline func的printf(“%s”,readLine)时,它会打印出奇怪的字符,无论如何,当我将readLine附加到字符串数组元素时,这些奇怪的字符在控制台上发生了变化,我想这就是为什么与第一个怪异的函数相比,与第一个怪异的函数相比,str.find(“”)或stod(str)函数的性能更好,因此性能会降低
如果您的想法相同,则可以提出一种防止在附加字符时更改字符的方法

最佳答案

这类性能问题是无法推理的。您需要使用探查器并测量代码的哪些部分占用了多少时间。
首先,我将使两个代码更加相似。有很多差异可能使问题感到困惑(因为版本1一旦发生巨大的内存泄漏)。

关于c++ - 将c++ getline文件输出复制到字符串时的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63210092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com