您好我正在尝试创建自己的grep程序版本。该程序将模式和文本文件作为输入并逐行搜索文件。当在行中找到模式时,将打印该行。
我的问题是我想并行搜索,同时分析每个文件,但没有程序加速,它需要的时间比串行版本的代码要多。
代码下方:
void searchPatternInFile(char *fileName, char *inputPattern){
size_t bufsize = 32;
char *tmpLineLeft, *tmpLineBeforePattern, *patFoundPointer;
FILE *fp;
int lineNum = 0;
int patPos = 0;
bool found = false;
fp=fopen(fileName, "r");
if(fp == NULL)
{
perror(fileName);
exit(1);
}
while(!feof(fp))
{
++lineNum;
tmpLineLeft = (char *)malloc(bufsize * sizeof(char));
if( tmpLineLeft == NULL)
{
perror("Błąd przy próbie dynamicznej alokacji pamięci!");
exit(1);
}
getline(&tmpLineLeft, &bufsize, fp);
patFoundPointer = strstr(tmpLineLeft, inputPattern);
found = patFoundPointer != NULL;
if(found)
{
printf(BLU "ĹšcieĹĽka:%s\n" MAG "Numer linii:%d\t" RESET, fileName, lineNum);
}
while(patFoundPointer)
{
patPos = patFoundPointer - tmpLineLeft;
tmpLineBeforePattern = (char *)malloc((patPos +1) * sizeof(char));
if( tmpLineBeforePattern == NULL)
{
perror("Błąd przy próbie dynamicznej alokacji pamięci!");
exit(1);
}
strncpy(tmpLineBeforePattern, tmpLineLeft, patPos);
tmpLineBeforePattern[patPos] = '\0';
strcpy(tmpLineLeft, &tmpLineLeft[patPos + strlen(inputPattern)]);
printf("%s", tmpLineBeforePattern);
printf(YEL "%s" RESET, inputPattern);
patFoundPointer = strstr(tmpLineLeft, inputPattern);
free(tmpLineBeforePattern);
}
if(found)
{
printf("%s\n", tmpLineLeft);
}
free(tmpLineLeft);
}
fclose(fp);
}
int main(int argc, char *argv[])
{
const int patternLen = 10;
char pattern[patternLen + 1];
//char fileName[FILENAME_MAX];
int numOfFilesToSearch = argc - 2;
float elapsed;
double start_time = omp_get_wtime();
if(argc < 3)
{
printf("Niepoprawne parametry!\n");
exit(1);
}
else
{
strncpy(pattern, argv[1], patternLen);
pattern[patternLen] = '\0';
}
int i;
#pragma omp parallel for
for(i = 1; i <= numOfFilesToSearch; ++i)
{
char localFileName[FILENAME_MAX];
strcpy(localFileName, argv[i+1]);
searchPatternInFile(localFileName, pattern);
}
double end_time = omp_get_wtime();
elapsed = end_time - start_time;
printf("Czas wykonania programu: %f s\n", elapsed);
return 0;
}