| 公司上了一个新系统,只有C#源代码与数据库连接信息,其它的东西都没有,逻辑也不清楚。 我认为应该从源码或者Oracle数据库入手,个人感觉影响速度的应该是如下的事件: Oracle数据库初次接触,他们公司用的是Oracle 11,工具是Toad // C# 源代码如下,系统是BS架构的,在一个界面上,扫入一个Wafer条码,要等很久才有反映。 namespace Focus.WIP     /// <summary>                 return (WorkOrderInfoEx)this[“WorkOrderData”];         private WorkOrderInfo TargetWorkOrderData                 return (WorkOrderInfo)this[“TargetWorkOrderData”];         private List<WMSLotInfo> WaferList                 return (List<WMSLotInfo>)this[“WaferList”];         private List<WMSLotInfo> SelectWaferList                 return (List<WMSLotInfo>)this[“SelectWaferList”];         private decimal LotSize                 return Convert.ToInt32(ttbLotSize.Text);         protected override void OnInit(EventArgs e)         protected void Page_Load(object sender, System.EventArgs e)                 if (!IsPostBack)                     var fromUrl = Request.ApplicationPath + “/ChipRule/WIP/ProcCreateLotByWafer.aspx?ProgramRightSID=” + ProgramRightSID;         void ttbWO_TextChanged(object sender, EventArgs e)         /// <summary>         /// <summary> //未完待续 ,代码太长了 | |
| 
// 接上面代码
      /// <summary>         /// <summary> ttbWO.Text = sWO;                 if (sWO.IsNullOrTrimEmpty())                 TargetWorkOrderData = null;                 string flag = WorkOrderData.Flag.ToUpper();                 //未發放數量 = 工單數量 – 已發放數量                 TargetWorkOrderData = InfoCenter.GetBySQL<WorkOrderInfo>(“SELECT * FROM MES_WPC_WO WHERE ERPWO = #[STRING] AND MAINFLAG = “”Y”””, WorkOrderData[“ERPWO”].ToString());                 #region 帶出批號數量:於品號設定批號容量屬性,帶出預設值                 //var sourceSite = ddlSourceSite.GetText();                 StringBuilder sb = new StringBuilder();                 if (!waferID.IsNullOrTrimEmpty()) sb.Append(” ORDER BY WAFERID “);                 //WaferList = InfoCenter.GetList<WMSLotInfo>(sb.ToString(), args.ToArray()).FindAll(p => p.WorkOrder.ToCimesString().IsIn(“”, “Empty”));                 ttbWafer.ReadOnly = false;         /// <summary>         /// <summary>         /// <summary>                 #region 檢查挑選片數不可大於未發放數量。                 if (ttbRecipeVersion.Text.IsNullOrTrimEmpty())                  
 | |
| 
// 接上面代码
             #region Transaction宣告                         #region 取得新Lot                         List<ComponentInfo> lstCreate = new List<ComponentInfo>();                             #region WMS 处理                             var nonactive = item.Fill<WMSLotNonactiveInfo>(true);                         createNewLot[“QUANTITY”] = lstCreate.Sum(p => p.ComponentQuantity);                         #region 处理MES_WIP_COMP_NONACTIVE                     cts.Complete();                 ReSetButton();                 ProgramInformationBlock1.ShowMessage(Msg.Hint.ExecuteSuccessfully(ProgramInformationBlock1.Caption));         LotCreateInfo GetCreateLotData(string sLot, decimal quantity, WorkOrderInfoEx WoData, WorkOrderInfo targerWO, decimal recipeVersion) 
 | |
| 
//  接上面代码
       protected void ttbWafer_TextChanged(object sender, EventArgs e)                 var findData = WaferList.FirstOrDefault(p => p.WAFERID == strWaferID || p.EPILASERMARK == strWaferID);                 //刷入的Wafer數量不可超過批號數量         protected void gvQuery_DataBound(object sender, EventArgs e)                 btnOK.Enabled = (SelectWaferList.Count > 0);         protected void gvQuery_RowDeleting(object sender, GridViewDeleteEventArgs e)                 //從清單中刪除此Wafer                 gvQuery.SetDataSource(SelectWaferList);         protected void ddlSourceSite_SelectedIndexChanged(object sender, EventArgs e) | |
| 
在开始查询数据库以及获取返回值的两条代码那里设置断点,然后开始调试执行。扫描条码之后,你会在两个断点出中断,估计一下分别所用的时间的数量级(比如说分别是“半秒钟,14秒钟,1秒钟”)就能知道下面该去重新分析哪一段程序了。 | |
| 100分 | 
分析一个程序的运行效率,需要反复执行程序7、8遍甚至十几遍,每一次都缩小范围。
 有些人在第一条语句设置断点,然后逐行执行,我的天(!),这样的人说是在调试和分析程序流程,其实是在瞎找一些自己认识的字眼儿而已,根本不能理解程序流程。 真正理解程序流程的人,可以在5分钟内迅速地对程序重复分析10次,而不是花20分钟去把程序仅仅罗列一次。 | 
| 
你贴出这么一大堆代码来,估计也就是向人家给你猜测一下。
 不要做我说的那种“逐行执行调试”的人。你应该自己分析程序来确定哪一两条语句花费了15秒,然后拿出真正的问题来讨论。 一个人最要学习的不是编程语句,而是调试、开发的方法。 | |
| 
不好意思,忘记说了,里面好多商业控件,代码无法调试…… | |
| 
你做还是我做啊?工资给我吧 | |
| 只是把所有代码贴出来,以供查看方便,不是让你们写代码的。只是分析哪里可能慢!代码无法调试!Oracle 不懂 | |
| 
没有高手吗? 就想知道从哪里下手,找出慢的SQL 语句,谢谢! | |
| 
十有八九是 数据库引起的。存储,视图等等,用的这个系统有没有日志输出?如果有就好办了。先从c#代码中找到调用的方法,看里面有没有执行数据库的存储,视图的东西。 | |
| 我认为也是这样,数据库的SQL 语句引起的。现在我就想找到这些有问题的语句,可是Oracle第一次接触,束手无策。代码也没有看出来有哪些语句。 | |
| 
请高手们出来,告诉我哪里可以追踪到速度慢?谢谢 代码不能运行,只能编译通过;Oracle数据库,我是第一次接触,谢谢! | |
| 代码不能运行,只能编译通过; ———————- | |
| 编译的话,也看不出哪里慢的吧?只有按F5 调试才行吧 | |
| 
我的意思是, 先编译一部分,运行,快,ok. 再增加一部分,运行,快,ok … 再增加一部分,运行,慢,哦,问题再这部分。 对出问题的代码再用上面的办法循环。 也许很罗嗦,但总比没有办法的好。 | |
|   报错信息,我百度了,好像是多国语言问题,但是代码中也没有看到问题。 | |
| 
这么长代码谁会用心看啊。:( 你用stopwatch,监控这个操作各个部分的用时,看看哪里执行的时间比较长,一般优先考虑的是代码出现问题。 | |
| 
我知道问题出在哪. 因为是从textchange事件里做的判断,而这是个后台方法,每改变一次值,页面就会回发一次,当然慢了 而扫条码是模拟的键盘,是一下子从键盘录入了10几个字符进去 那么页面需要刷新10几次,能不慢吗 你需要做JS或JQ脚本,从前台验证是否输入完毕,然后再调后台方法存数据库 | |
| 
我大概知道问题出在哪. 可能是sql查询语法有问题 这部分可能要找原厂 | |
| 
条码枪的原理是扫出二维码然后加一个回车 ttbWafer_TextChanged为啥要更改一次查询一次呢? | |
| ttbWafer_TextChanged 跟資料有關的變數有兩個 以上兩個變數都不存在 程式會不斷的存取資料庫的問題 往別的方向查一下吧 老大 | |
| 
加log看看是不是一个字符查询一次 | |
| 
23樓有懂Text_Change的原理? 有懂條碼槍的原理? 懂了再提意見吧 大哥 | |
| 
亲, 你知道神马是asp.net吗 | |
| 
亲, 你知道神马是asp.net吗 | |
| 
show出处理时间 慢慢缩小范围 | |
| 
谢谢大家的激烈讨论,如果有办法调试代码,我也能看出大概问题。 现在两个问题: 1) 扫入WaferID 很慢, 我看代码也没有发送什么SQL 语句,请大家继续讨论。 2) 代码报错,好像是多国语言。我将25行 <asp:Label ID=”lblProgress” runat=”server” Text=”<%$ Resources:Auto|RuleFace, DataProcessing %>” 改成不用资源对象: <asp:Label ID=”lblProgress” runat=”server” Text=”Test” 但是,一按F5运行,那个用户控件就又被自动改回去,代码就还报那个错误,这个有办法解决没?再次感谢大家捧场! | |
| 
VS2013中的性能诊断可以监控耗时和调用次数较多的函数。 不过楼主应该从数据库写入次数,文件载入速度,多重循环这几个方面先看看 | |
| 
问题没有解决,决定联系开发的人了,谢谢大家! | |
| 
兄弟,一看就知道,是LED 的MES ,WIP模块。这个问题太简单了,哈哈, | |
 
                    


