其他部门人员用C++采集到的数据记录格式如下:
数据库字段名:(varbinary)(8000)
0x61313534300000000000000000000000
61313534310000000100010001000100
61313534300000000000000000000000
61313534310000000100010001000100
横向有500个信息;用C#解析后单个数据如下:a1540,0,0,0,0
按每天900条数据计算,C#共要循环900*500次。
我这边用asp.net统计一天的数据,服务器会计算35秒,再跟其它数据信息汇总共用时46秒,无法接受。。
但C++那边将数据取出之后直接操作内存,一个指向每行的数据就统计出来了,因此只需缓缓900行,用时3.2秒。
C++的代码不贴了,下面贴出C#代码,望大侠给出解决办法.
SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader();
    while (mySqlDataReader.Read())
    {
        System.Data.SqlTypes.SqlBinary mySqlBinary = mySqlDataReader.GetSqlBinary(0);
        int nArrayLen = mySqlBinary.Length / 16;
        for (int nArrayIndex = 0; nArrayIndex < nArrayLen; nArrayIndex++)
        {
            byte[] bySubSite = new byte[8];
            byte[] byIP = new byte[2];
            byte[] byWindow = new byte[2];
            byte[] byReach = new byte[2];
            byte[] byClick = new byte[2];
            for (int i = 0; i < 8; i++)
            {
                bySubSite[i] = mySqlBinary.Value[nArrayIndex * 16 + i];
            }
            for (int i = 0; i < 2; i++)
            {
                byIP[i] = mySqlBinary.Value[nArrayIndex * 16 + 8 + i];
            }
            for (int i = 0; i < 2; i++)
            {
                byWindow[i] = mySqlBinary.Value[nArrayIndex * 16 + 10 + i];
            }
            for (int i = 0; i < 2; i++)
            {
                byReach[i] = mySqlBinary.Value[nArrayIndex * 16 + 12 + i];
            }
            for (int i = 0; i < 2; i++)
            {
                byClick[i] = mySqlBinary.Value[nArrayIndex * 16 + 14 + i];
            }
            string strValue = Encoding.Default.GetString(bySubSite);
            int nIPCount = System.BitConverter.ToInt16(byIP, 0);
            int nWindowCount = System.BitConverter.ToInt16(byWindow, 0);
            int nReachCount = System.BitConverter.ToInt16(byReach, 0);
            int nClickCount = System.BitConverter.ToInt16(byClick, 0);
            string subid = strValue.Replace("\0", "");
                if (ht.ContainsKey(subid))
                {                    string[] iii = ht[subid].ToString().Split('_');                    int ipnum = int.Parse(iii[0]) + nIPCount;                    int wnum = int.Parse(iii[1]) + nWindowCount;                    int rnum = int.Parse(iii[2]) + nReachCount;                    int cnum = int.Parse(iii[3]) + nClickCount;                    ht[subid] = ipnum.ToString() + "_" + wnum.ToString() + "_" + rnum.ToString() + "_" + 
cnum.ToString() + "_" + arrPromocodeMemberReg.Length + "_" + arrPromocodeMemberlogin.Length + "_" + 
arrPromocodeMemberpaynum.Length;
                }
                else
                {
                    string key = subid;                    string value = nIPCount.ToString() + "_" + nWindowCount.ToString() + "_" + 
nReachCount.ToString() + "_" + nClickCount.ToString() + "_" + arrPromocodeMemberReg.Length + "_" + 
arrPromocodeMemberlogin.Length + "_" + arrPromocodeMemberpaynum.Length;
                    ht.Add(key, value);
                }
            }
        }
        mySqlDataReader.Close();
        mySqlDataReader.Dispose();
        mySqlConnection.Close();

解决方案 »

  1.   


    byte[] bySubSite = new byte[8];
      byte[] byIP = new byte[2];
      byte[] byWindow = new byte[2];
      byte[] byReach = new byte[2];
      byte[] byClick = new byte[2];
    都可以重用的。
    for (int i = 0; i < 8; i++)
      {
      bySubSite[i] = mySqlBinary.Value[nArrayIndex * 16 + i];
      }
      for (int i = 0; i < 2; i++)
      {
      byIP[i] = mySqlBinary.Value[nArrayIndex * 16 + 8 + i];
      }
      for (int i = 0; i < 2; i++)
      {
      byWindow[i] = mySqlBinary.Value[nArrayIndex * 16 + 10 + i];
      }
      for (int i = 0; i < 2; i++)
      {
      byReach[i] = mySqlBinary.Value[nArrayIndex * 16 + 12 + i];
      }
      for (int i = 0; i < 2; i++)
      {
      byClick[i] = mySqlBinary.Value[nArrayIndex * 16 + 14 + i];
      }这些用Array.Copy会死啊。
    string value = nIPCount.ToString() + "_" + nWindowCount.ToString() + "_" + 
    nReachCount.ToString() + "_" + nClickCount.ToString() + "_" + arrPromocodeMemberReg.Length + "_" + 
    arrPromocodeMemberlogin.Length + "_" + arrPromocodeMemberpaynum.Length;
    用StringBuilder拼接会死啊,用string.Format会死啊不会高效的用C#就别嫌C#比C++慢。
    按照这样我也能写出比Java还慢的汇编。