C#为什么这么慢??

Tips:点击图片进入下一页



LeetCode刷题http://leetcode.com/problems/partition-labels/description/

Partition Labels这道题我用C#写出来居然要跑300~400ms,我还以为我思路有问题,百度了一下思路没错啊,大家都是记录字符出现的最后一个位置,再往前找有没有漏网之鱼

可是同样的算法,C++10ms跑完就算了,JAVA只要十几ms,Python也只要几十ms,我把他们的算法原模原样复制下来改成C#,立马变成300+ms
到底是LeetCode不待见C#,还是C#真的慢??同样代码C++10ms

    class Solution {
    public:
        vector partitionLabels(string S) {
            vector ans;
            int last[26];
            for(int i=0;i        {
                last[S[i]-"a"] = i;
            }
            
            int lastpos = 0, ex = 0;
            for(int i=0;i        {
                lastpos = max(lastpos, last[S[i]-"a"]);
                if(lastpos == i) {
                    ans.push_back(i + 1 - ex);
                    ex = i + 1;
                }
            }
            return ans;
        }
    };
复制代码改成C#就300+
        public class Solution
        {

                public List PartitionLabels(string S)
                {
                    List ans = new List();
                    int[] last = new int[26];
                    for (int i = 0; i < S.Length; i++)
                    {
                        last[S[i] - "a"] = i;
                    }

                    int lastpos = 0, ex = 0;
                    for (int i = 0; i < S.Length; i++)
                    {
                        lastpos = Math.Max(lastpos, last[S[i] - "a"]);
                        if (lastpos == i)
                        {
                            ans.Add(i + 1 - ex);
                            ex = i + 1;
                        }
                    }
                    return ans;
                }
        }
复制代码JAVA只要12ms
    public List partitionLabels(String S) {
            List ans = new ArrayList<>();
            char[] cs  = S.toCharArray();
            int n = cs.length;
            int[] last = new int[32];
            for (int i = 0; i < n; ++i) {
                last[cs[i] - "a"] = i;
            }
            int pre = -1;
            int max = 0;
            for (int i = 0; i < n; ++i) {
                if (last[cs[i] - "a"] > max) max = last[cs[i] - "a"];
                if (max == i) {
                    ans.add(max - pre);
                    pre = max;
                    max = max + 1;
                }
            }
            return ans;
        }
复制代码原模原样改成C#立马变300+ms
        public class Solution
        {

            public List PartitionLabels(String S)
            {
                List ans = new List();
                char[] cs = S.ToCharArray();
                int n = cs.Length;
                int[] last = new int[32];
                for (int i = 0; i < n; ++i)
                {
                    last[cs[i] - "a"] = i;
                }
                int pre = -1;
                int max = 0;
                for (int i = 0; i < n; ++i)
                {
                    if (last[cs[i] - "a"] > max) max = last[cs[i] - "a"];
                    if (max == i)
                    {
                        ans.Add(max - pre);
                        pre = max;
                        max = max + 1;
                    }
                }
                return ans;
            }

        }
复制代码我看你就是在为难我C#.jpg


网友评论:
不是c#的问题吧,在线运行设计到解释器和优化问题。你要非说C#有问题,可以把代码贴出来,有VS环境的本地跑一下看看多久,如果还这么慢那才说明是C#的问题。
OJ标配是mono+debug,当然比不过有优化的了

—— 来自 Sony F5122, Android 7.1.1上的 v1.3.2.1-fix-play
10几年前我遇到过一次挺神的问题。
c#里的list的addAll和for循环一个个add一样速度。比同样的java code慢10倍+。
当然也许是因为我比较搓
你是第一次用c#刷leetcode?
一般一模一样的算法,lc上c#跑出来比c艹慢20倍,就算没错了。
慢不慢你试试真机不就行了,leetcode后台怕不是在用mono 2.0或者更蛋疼的环境
http://benchmarksgame.alioth.debian.org/
因为不是编译到机器码
c#最大的性能坑就是gc,要万分注意

等一下,gc这个坑,java也有啊
c最后vector发生复制了吧,不然是不是还能快点?
我说我怎么没见过c#的高票答案,原来是不好意思贴速度吗
c#为了前台方便,集成了太多东西


玩过几个unity做的游戏都很重,是不是因为c#?
不懂C# , 不过java ArrayList可以random access. c# 那个list可以吗?
试了下, 你啥都不写也能跑108ms
破案了,是LeetCode的锅。我在本地试了下,也就0.22秒,GC和IL的问题只占0.15秒
你这也高级黑啊。。。。0.22秒不是比其他语言慢个几十倍么。。

—— 来自 Xiaomi MI 6, Android 8.0.0上的 v1.3.2.2
0.22s比300ms快很多?


循环500次,才50ms,你咋算出的0.22秒,难道用的vs2003吗
这锅c#可不背啊233
楼主你别跟我说你是用timer class测的时间


喷了,0.22秒试了下运行一万次花了0.25秒
我的是38ms啊,瞎几把说

按现在标准应该会用move constructor所以不会复制