当前位置: 代码迷 >> VC >> 大失所望!C#完败C++/Cli
  详细解决方案

大失所望!C#完败C++/Cli

热度:503   发布时间:2016-05-05 00:03:01.0
失望!C#完败C++/Cli
原本以为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++比C#慢,改成非调试模式后,C++明显比C#快
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;
                    }