我有一个程序应该从文本文件中检索(启动时)数据。这个文件可能会变得很大,我想知道如何加快流程并评估其当前的性能。 用于检索数据的代码如下:
void startUpBillsLoading(Bill *Bills)
{
FILE *BillsDb = 0, *WorkersDb = 0, *PaymentDb = 0;
BillsDb = fopen("data/bills.db", "r");
WorkersDb = fopen("data/workers.db", "r");
PaymentDb = fopen ("data/payments.db", "r");
char *Buffer = malloc (512);
if (BillsDb && WorkersDb && PaymentsDb)
{
int i = 0, j = 0;
while (fscanf (BillsDb, "%d;%[^;];%[^;];%[^;];%[^;];%d/%d/%d;%d/%d/%d;%d;%f;%f\n",
&Bills[i].Id,
Bills[i].CompanyName,
Bills[i].ClientName,
Bills[i].DepartureAddress,
Bills[i].ShippingAddress,
&Bills[i].Creation.Day,
&Bills[i].Creation.Month,
&Bills[i].Creation.Year,
&Bills[i].Payment.Day,
&Bills[i].Payment.Month,
&Bills[i].Payment.Year,
&Bills[i].NumWorkers,
&Bills[i].TotalHT,
&Bills[i].Charges) == 14)
{
Bills[i].Workers =
malloc (sizeof(Employee)*Bills[i].NumWorkers);
fscanf (PaymentDb, "%d;%d;%[^;];%[^;];%[^\n]\n",
&Bills[i].Id,
&Bills[i].PaymentDetails.Method,
Bills[i].PaymentDetails.CheckNumber,
Bills[i].PaymentDetails.VirementNumber,
Bills[i].PaymentDetails.BankName);
LatestBillId++;
i++;
}
i = 0;
while (fscanf (WorkersDb, "%d;%[^;];%[^;];%f\n",
&Bills[i].Id,
Bills[i].Workers[j].Surname,
Bills[i].Workers[j].Name,
&Bills[i].Workers[j].Salary) == 4)
{
for (int j = 1; j <= Bills[i].NumWorkers-1; j++)
{
fscanf (WorkersDb, "%d;%[^;];%[^;];%f\n",
&Bills[i].Id,
Bills[i].Workers[j].Surname,
Bills[i].Workers[j].Name,
&Bills[i].Workers[j].Salary);
}
i++;
}
fclose(BillsDb);
fclose(WorkersDb);
fclose(PaymentDb);
}
else
printf ("\t\t\tImpossible d'acceder aux factures !\n");
free (Buffer);
}
我使用time.h
库来测量检索所有必需数据所需的时间。
Bill的数据分为3个文件:bills.db,workers.db和payments.db。来自bills.db
和来自payments.db
的每个文件行代表整个帐单,而在workers.db
中,代表帐单所需的行数是可变的,并且取决于与之相关的员工数量法案。
我用这种方式创建了这3个文件:
bills.db
和payments.db
有118087行(因此有很多帐单)workers.db
文件有118087 * 4 = 472348行。此功能完全运行所需的时间约为0.9秒。 这次有多好(或坏)以及如何改善它?
答案 0 :(得分:0)
你必须阅读的内容很少。首先是渐近时间复杂度和渐近空间复杂度,其次是 Big O符号。 Big O符号表示程序的运行情况。对于您提供的代码,Big O复杂度为 O(n ^ 2) aprox。因此,最大限制是好的,因为它与快速排序相同,但由于您使用的数据有很长的长度,因此加载时间将始终添加到您的运行时。如果您想改进尝试最小化数据的长度并且从文件中读取最少的。因为如果n的值增加,时间会迅速增加。您可以从这里了解asymptotic notation和Big O notation