我正在用c ++创建一个dll,我将在Delphi 7项目中使用一些函数。
我导出的第一个函数大大降低了程序的性能,我已经使用AQtime进行了检查,最慢的函数就是我的dll中的函数。
该函数只是检查给定的char是否在数组中,在使用OpenMP指令之前它也运行得很慢,所以不应该这样。
bool Validate(char character)
{
char char_store[] = {',' , '+' , '-' , '*' , '/',
'(' , ')' , '^' , '[' , ']' ,
'%' , '&' , '=' , '<' , '>' ,
' ' , '.' , ';' , ':', char(13) , char(10)};
bool abort = false;
#pragma omp parallel for
for(int i = 0; i < 21; i++)
{
#pragma omp flush (abort)
if(!abort)
{
if (char_store[i] == character)
{
abort = true;
#pragma omp flush (abort)
}
}
}
return abort;
}
我知道在Delphi中你可以创建一个函数以更简单的方式检查同一个东西,但我发现很难相信这个小数组会导致我的程序从几秒钟减慢到几分钟。
我正在为我的dll使用静态加载。
function Validate(character:Char):Boolean; CDECL;外部'Library.dll';
出现这种情况的原因是什么?
答案 0 :(得分:2)
你的功能很简单。它是一个for
循环,有21次迭代,执行几个简单的相等测试。它可以在约100个周期内执行。 OpenMP的开销要高出许多个数量级。
简单地说,你不能指望线程在这里提高性能。您需要更大的工作任务才能使线程生效。用Delphi编写的单线程代码将是在您的问题中实现代码的最有效方式。
如果删除所有OpenMP没有帮助(你说你的代码在没有OpenMP的情况下很慢),那么你需要查看你的编译器选项。你在编译优化吗?如果您对性能有疑问,那么您确实需要提供可重现的测试用例和时间。
你的C ++代码也很奇怪。这是不必要的复杂。它可以这样写:
bool Validate(const char character)
{
const char char_store[] = {
',' , '+' , '-' , '*' , '/', '(' , ')' , '^' , '[' , ']' , '%' ,
'&' , '=' , '<' , '>' , ' ' , '.' , ';' , ':',
char(13) , char(10)};
for(int i = 0; i < 21; i++)
if (char_store[i] == character)
return true;
return false;
}
将此代码放入DLL或尝试使用并行for
毫无意义。您需要将程序分解为更大的工作单元才能实现并行化。