性能差异巨大

Feb 22, 2010 at 5:06 AM

var zjgls = vd_zjgl_BAK.FindAll();

            var zjgl_Distinct = zjgls.Distinct(new ZJGLComparer<vd_zjgl_BAK>());

            var zjgl_Del = zjgls.Except(zjgl_Distinct).ToList();

            foreach (var del in zjgl_Del)
            {
                del.Delete();
            }

----

public class ZJGLComparer<T> : IEqualityComparer<T> where T : vd_zjgl_BAK
    {

        #region IEqualityComparer<T> Members

        public bool Equals(T x, T y)
        {
            if ( x.zcdhId == y.zcdhId && x.jfrq == y.jfrq)
                return true;
            else
                return false;
        }

        public int GetHashCode(T obj)
        {
            return 1;
        }

        #endregion
    }

 

这是高性能的

Feb 22, 2010 at 5:08 AM

public class ZJGLComparer<T> : IEqualityComparer<T> where T : vd_zjgl
    {

        #region IEqualityComparer<T> Members

        public bool Equals(T x, T y)
        {
            if (x.GetForeignKey("zcdhId") == y.GetForeignKey("zcdhId") && x.jfrq == y.jfrq)
                return true;
            else
                return false;
        }

        public int GetHashCode(T obj)
        {
            return 0;
        }

        #endregion
    }

 

这个是超级低性能的,看来GetForeignKey这个扩展方法的性能太太太低了,呵呵,因为每次都要查一遍

 

Feb 25, 2010 at 3:36 AM

恩。有时候只是为了获取一下ID, y.GetForeignKey("zcdhId")此方法用起来不太舒服

以前我曾经提议过 加一个ReadOnlyAttribute,来辅助FK的读取。(似乎没被采用,不知道原因是什么)

http://dbentry.codeplex.com/Thread/View.aspx?ThreadId=66859

Coordinator
Feb 25, 2010 at 4:53 AM

这里的性能差别是因为GetForeignKey使用了反射,自然比Emit的代码慢,但是其实并不重要:

  • 大部分情况下,不要去在意多一条使用PK获取对象的SQL,在所有数据库中,它都是最快的语句,而且命中Cache的可能性很大。
  • 在特殊情况下,使用GetForeignKey去取得FK,目的是减少一条SQL调用,它只应该用于已有一台DB服务器和多台Web服务器的情况,而这种情况下,GetForeignKey的性能开销都在Web服务器上,只要对DB服务器没有造成压力,就算完成任务。