公司上了一个新系统,只有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模块。这个问题太简单了,哈哈,
|