原本以为C++/Cli性能会比c#高,写了两个方法,一个是计算一个字符串A在大字符串B中出现的位置,一个是反转字符串
结果发现用C#写的性能比C++要高!
上代码
计算字符串出现次数:
int C_StringExpand::StringExpand::StringCount(String^ original,String^ substring)
{
//查找字符串的长度
int len=substring->Length;
//原字符串和查找字符串的指针
pin_ptr<const wchar_t> p_original = PtrToStringChars(original);
pin_ptr<const wchar_t> p_substring = PtrToStringChars(substring);
if(original->Length<len)
{
return -1;
}
int n=0;
int size=sizeof(wchar_t);
while(*p_original)
{
//只有第一个字符相等才开始比较
if(*p_original==*p_substring)
{
if(memcmp(p_original,p_substring,size*len)==0)
{
n++;
p_original+=len;
}
else
{
p_original++;
}
}
else
{
p_original++;
}
}
p_original=nullptr;
p_substring=nullptr;
return n;
}
反转字符串:
String^ C_StringExpand::StringExpand::Reverse(String^ str)
{
int len=str->Length;
//内存区的长度
int mlen=(len)*sizeof(wchar_t);
//固定的指针
pin_ptr<const wchar_t> p = PtrToStringChars(str);
//分配一块内存
wchar_t* p1=(wchar_t*)malloc(mlen);
memcpy(p1,p,mlen);
wchar_t* p2=p1+len;
int n=0;
wchar_t t;
while (p1<p2)
{
n++;
p2--;
t=*p1;
*p1=*p2;
*p2=t;
p1++;
}
//还原p1的位置
p1-=n;
String^ s=gcnew String(p1);
//清除p1所指的内存
free(p1);
p1=NULL;
p2=NULL;
return s;
}
我也不确定是不是我的算法写错,反正我测试出来的结果就是比用C#写的要慢,我是C#直接调用c++的dll。
请各位指教下~~
------解决思路----------------------
.net处理装箱拆箱、对象封装、数组等方面可能会慢一点。但是这是有意义的。
http://blog.chinaunix.net/uid-97185-id-4410536.html
http://dearymz.blog.163.com/blog/static/2056574200944115015282/
------解决思路----------------------
C#也有指针
public static readonly func<int, string> FastAllocateString = (func<int, string>)Delegate.CreateDelegate(typeof(func<int, string>), typeof(string).GetMethod("FastAllocateString", BindingFlags.Static
------解决思路----------------------
BindingFlags.NonPublic, null, new Type[] { typeof(int) }, null));
public unsafe static string Reverse(string str)
{
if (str == null) return null;
if (str.Length == 0) return string.Empty;
string newString = fastCSharp.String.FastAllocateString(str.Length);
fixed (char* strFixed = str, newFixed = newString)
{
for (char* start = strFixed, end = strFixed + str.Length, write = newFixed; start != end; *write++ = *--end) ;
}
return newString;
} public unsafe static void FixedReverse(string str)
{
if (str != null)
{
fixed (char* strFixed = str)
{
for (char* start = strFixed, end = strFixed + str.Length; start < end; ++start)
{
char temp = *start;
*start = *--end;
*end = temp;
}