[英]What is a better way for me to do these null checks and improve the performance of this code
這項工作正在談論30多個小時的時間。 該迭代器可容納80萬條記錄,並且循環必須為每條記錄執行,並且在同一方法中大約有20多個這些檢查。 在這里如何避免圈復雜度?
CustomerPreference newRecord = null;
while (iterator.hasNext())
{
final CustomerPreference current = iterator.next();
if (newRecord != null)
{
if (!newRecord.getEmail().equals(current.getEmail()))
{
resList.add(newRecord);
newRecord = current;
}
}
else
{
newRecord = current;
}
if (null != current.getEmailPref())
{
newRecord.setEmailPref(current.getHdCaEmailPref());
}
else
{
if (newRecord.getEmailPref() == null)
{
newRecord.setEmailPref(NO_CHANGE);
}
}
如果這只是一個內部應用程序,請進行檢查並將代碼包含在try / catch塊中,尤其是在空引用的可能性很小的情況下。
catch塊將繼續循環。
空檢查最多可能需要一個CPU周期,為了保守起見,我們將其稱為1ns。 800k x 20 x 1 ns = 16毫秒...
=>空檢查不是您的問題!
我懷疑真正的性能問題不在顯示的代碼范圍內。 即使字符串比較花費一微秒的時間,並且循環的迭代包含數百個微秒,一次迭代的時間也不應超過一毫秒。 這將導致大約10到15分鍾的運行時間。
這些檢查可能不是性能下降的原因。 但是您可以通過遵循良好的編碼約定來避免可能的邏輯錯誤。
我遵循以下約定。
盡可能避免成員變量的lazy initialization
。 在聲明本身中初始化變量。 這將處理NullPointerExceptions。
在周期的早期確定成員變量的mutability
。 有效地使用諸如final
關鍵字之類的語言結構。
如果您知道方法的擴充不會更改,請將其聲明為final
。
盡可能限制數據的mutation
。 某些變量可以在構造函數中創建,並且永遠不能更改。 如果可能,請刪除公共設置方法。
最后,在正確的位置有效地使用try{} catch{} finally{}
塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.