複習筆記9 if else 以及效率優化



public class Test10
{
	public static void main(String[] args)
	{
		//if else
		int x = 0;
		//當表達式x > 1爲真時進入作用域1中
		//當表達式結果爲假時進入作用域2中
		//作用域1 和 作用域2是不會並存的
		if(x > 1)
		{
			// 1
		}
		else 
		{
			// 2
		}
		
		//else if 可以有多個,表示第一層次的邏輯劃分
		if(x > 1)
		{
			// 1
		}
		else if(x < 1)
		{
			// 2
		}
		else
		{
			// 3
		}		
		
		//這個代碼屬於典型的垃圾代碼,x > 2的話
		//一定會大於1
		if(x > 1)
		{
			if(x > 2)
			{
				// code
			}
		}
		
		//對於這個代碼而言
		//x只有等於2或者大於2兩種
		//多加一個x > 1只會讓代碼看起來難懂
		if(x > 1)
		{
			if(x > 2)
			{
				
			}
			else
			{
				
			}
		}
		
		//這段代碼效率很低,實際上你把0-9的10個數
		//分兩段
		//x > 1的情況有8種,也就是說第二個表達式
		//判斷了8次,加上第一個的10次,總共18次
		
		//如果把兩個表達式順序調換下,你會發現
		//x < 4僅有4種,總共14次
		for (int i = 0; i < 10; i++)
        {
			//錯誤
			if(i > 1 && i < 4)
			{
				
			}
			
			//正確
			if(i < 4 && i > 1)
			{
				
			}
			
			//正確
			if(i < 4)
			{
				if(i > 1)
				{
					
				}
			}
        }
		//這個是上邊這個的測試
		printTimes();
		System.out.println("===================================>");
		
		//對於這個代碼,如果邏輯區是連續的,
		//這樣寫並不是好辦法,額外的判斷次數
		//會使效率低下
		if(x < 10)
		{
			if(x > 7)
			{
				
			}
			else if(x > 5 && x < 8)
			{
				
			}
			else if(x > 3 && x < 6)
			{
				
			}
		}
		//簡單把邏輯區域劃分一下,其實還是蠻簡單的
		if(x < 10)
		{
			if(x > 7)
			{
				
			}
			else if(x > 5)
			{
				
			}
			else if(x > 3)
			{
				
			}
		}
		printTimes1();
		System.out.println("===================================>");
	}
	
	/*
		for (int i = 0; i < 2000000000; i++)
		    for (int j = 0; j < 1000; j++)
		        if (j > 0 && j < 100)  times=4501377 ns
		        if (j < 100 && j > 0)  times=3312574 ns
	 */
	public static void printTimes()
	{
		int y = 2;
		long nano = 0l;
		System.out.println("for (int i = 0; i < 2000000000; i++)");
		System.out.println("    for (int j = 0; j < 1000; j++)");
		nano = System.nanoTime();
		for (int j = 0; j < 2000000000; j++)
        {
			for (int i = 0; i < 1000; i++)
			{
	        
	            if(j > 0 && j < 100)
	            {
	            	y = 5 / 3;
	            }
            }
        }
		nano = System.nanoTime() - nano;
		System.out.println("        if (j > 0 && j < 100)  times=" + nano + " ns");
		
		nano = System.nanoTime();
		for (int j = 0; j < 2000000000; j++)
        {
			for (int i = 0; i < 1000; i++)
			{
	        
	            if(j < 100 && j > 0)
	            {
	            	y = 5 / 3;
	            }
            }
        }
		nano = System.nanoTime() - nano;
		System.out.println("        if (j < 100 && j > 0)  times=" + nano + " ns");
	}
	
	/*
		for (int i = 0; i < 2000000; i++)
		    for (int j = 0; j < 10; j++)
		        if(y > 7 && y < 10)
		        else if(y > 5 && y < 8)
		        else if(y > 3 && y < 6)  times=29993107 ns
		
		        if(y < 10)
		            if(y > 7)
		            else if(y > 5)
		            else if(y > 3)       times=21235980 ns
	 */
	public static void printTimes1()
	{
		int y = 0;
		long nano = 0l;
		System.out.println("for (int i = 0; i < 2000000; i++)");
		System.out.println("    for (int j = 0; j < 10; j++)");
		nano = System.nanoTime();
		for (int j = 0; j < 2000000; j++)
        {
			for (int i = 0; i < 10; i++)
			{
				if(y > 7 && y < 10)
				{
					y = 5 * 0;
				}
				else if(y > 5 && y < 8)
				{
					y = 5 * 0;
				}
				else if(y > 3 && y < 6)
				{
					y = 5 * 0;
				}
            }
        }
		nano = System.nanoTime() - nano;
		System.out.println("        if(x > 7 && x < 10)");
		System.out.println("        else if(x > 5 && x < 8)");
		System.out.println("        else if(x > 3 && x < 6)      times=" + nano + " ns");
		System.out.println();
		
		nano = System.nanoTime();
		for (int j = 0; j < 2000000; j++)
        {
			for (int i = 0; i < 10; i++)
			{
	        
				if(y < 10)
				{
					if(y > 7)
					{
						y = 5 * 0;
					}
					else if(y > 5)
					{
						y = 5 * 0;
					}
					else if(y > 3)
					{
						y = 5 * 0;
					}
				}
            }
        }
		nano = System.nanoTime() - nano;
		System.out.println("        if(x < 10)");
		System.out.println("            if(x > 7)");
		System.out.println("            else if(x > 5)");
		System.out.println("            else if(x > 3)           times=" + nano + " ns");
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章