• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag
 

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: The Case of the Missing Case Statement
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: The Case of the Missing Case Statement


  • Subject: Re: The Case of the Missing Case Statement
  • From: email@hidden
  • Date: Sun, 05 Apr 2015 07:34:48 +0200

on jumpTableFor1by13(n)
	if n = 1 then
		return 1
	else if n = 2 then
		return 2
	else if n = 3 then
		return 3
	else if n = 4 then
		return 4
	else if n = 5 then
		return 5
	else if n = 6 then
		return 6
	else if n = 7 then
		return 7
	else if n = 8 then
		return 8
	else if n = 9 then
		return 9
	else if n = 10 then
		return 10
	else if n = 11 then
		return 11
	else if n = 12 then
		return 12
	else if n = 13 then
		return 13
	else
		return -1
	end if
end jumpTableFor1by13
5. apr. 2015 kl. 00:15 skrev S. J. Cunningham <email@hidden>:

> I have a need to compare n different things and take a different branch for each one.  A great application for the imaginary Applescript "case" statement :)  Does anyone have a clever way to do this other than a brute force bunch of if-then statements?
>
> I figured that, on the average, I would be executing n/2 if-then tests for each iteration.  In my case n is currently 13 so figure 6.5 tests.  I decided to get clever and speed things up by doing the equivalent of a binary search, ie dividing the cases in half at each branch, thus reducing the number of tests to log base 2 of n, in my case, log base 2 of 13 or about 3.7.  I expected this to perform significantly faster: 3.7 tests on average rather than 6.5.
>
> I wrote the attached script to test out my theory and was surprised by the results:
>
> Case Statement Test Results for 80,000 Tests
>                     (in Seconds)
>
> 	straight IF	          If-ElseTree	   Binary Search IF
> Run 1	 37			49			58
> Run 2	51			 47			40
> Run 3 	39			40			44
> Run 4	44			44			43
> Run 5	44			42			41
> Average 	 43.0              44.4			 45.2
>
> Not only was there not much difference but the Binary Search did marginally worse.
>
> I would be curious to hear any explanations as to why this might be so.
>
> -------------  Attached Script  --------------------------
>
> set nTests to 80000
> set nRuns to 5
> set savetoFile to true
> set displayResults to true
> set saveResultsFileName to "Case Statement Test Results.txt"
> set resultsText to "Case Statement Test Results for " & nTests & " Tests" & return & "                     (in Seconds)" & ¬
> 	return & return & tab & "straightIF" & tab & "IfElseTree" & tab & "BinarySearchIF" & return
> set straightIFtimes to {}
> set IfElseTreetimes to {}
> set BinarySearchIFtimes to {}
> set fatTab to "         "
>
>
> repeat with nRun from 1 to nRuns
>
> 	set startTime to current date
> 	repeat nTests times
> 		set theResult to StraightIF(random number from 1 to 13)
> 		(*
> 				if theResult > 0 then
> 					display dialog "Case " & theResult
> 				else
> 					display dialog "Error. " & (n as text) & " is out of range"
> 				end if
> 			*)
> 	end repeat
> 	set endTime to current date
> 	set straightIFtime to endTime - startTime
> 	-- display dialog "StraightIF time for " & nTests & " tests" & tab & straightIFtime & " seconds"
> 	set the end of straightIFtimes to straightIFtime
>
>
> 	set startTime to current date
> 	repeat nTests times
> 		set theResult to IfElseTree(random number from 1 to 13)
> 		(*
> 				if theResult > 0 then
> 					display dialog "Case " & theResult
> 				else
> 					display dialog "Error. " & (n as text) & " is out of range"
> 				end if
> 			*)
> 	end repeat
> 	set endTime to current date
> 	set IfElseTreetime to endTime - startTime
> 	-- display dialog "IfElseTree time for " & nTests & " tests" & tab & IfElseTreetime & " seconds"
> 	set the end of IfElseTreetimes to IfElseTreetime
>
>
> 	set startTime to current date
> 	repeat nTests times
> 		set theResult to BinarySearchIF(random number from 1 to 13)
> 		(*
> 				if theResult > 0 then
> 					display dialog "Case " & theResult
> 				else
> 					display dialog "Error. " & (n as text) & " is out of range"
> 				end if
> 			*)
> 	end repeat
> 	set endTime to current date
> 	set BinarySearchIFtime to endTime - startTime
> 	-- display dialog "BinarySearchIF time for " & nTests & " tests" & tab & BinarySearchIFtime & " seconds"
> 	set the end of BinarySearchIFtimes to BinarySearchIFtime
>
> 	(*
> 		display dialog "Times for " & nTests & " tests:" & return & return & ¬
> 			"StraightIF" & tab & straightIFtime & " seconds" & return & ¬
> 			"IfElseTree" & tab & IfElseTreetime & " seconds" & return & ¬
> 			"BinarySearchIF" & tab & BinarySearchIFtime & " seconds" & return
> 	*)
>
> 	set resultsText to resultsText & "Run " & nRun & fatTab & straightIFtime & fatTab & fatTab & IfElseTreetime & fatTab & fatTab & BinarySearchIFtime & return
> end repeat
>
> set StraightIFAverage to averageOf(straightIFtimes)
> set IfElseTreeAverage to averageOf(IfElseTreetimes)
> set BinarySearchIFAverage to averageOf(BinarySearchIFtimes)
> set resultsText to resultsText & "Average " & fatTab & StraightIFAverage & fatTab & fatTab & IfElseTreeAverage & fatTab & fatTab & BinarySearchIFAverage
>
> if displayResults then
> 	display dialog resultsText
> end if
>
> if savetoFile then
> 	tell application "Finder"
> 		set hfsParentFolderPath to get container of (path to me)
> 		set myFolderPath to (contents of hfsParentFolderPath) as text
> 	end tell
> 	set fID to open for access myFolderPath & saveResultsFileName with write permission
> 	write resultsText to fID
> 	close access fID
> end if
>
>
>
>
> on averageOf(aList)
> 	set theSum to 0
> 	repeat with n in aList
> 		set theSum to theSum + n
> 	end repeat
> 	set theAverage to theSum / (count of aList)
> 	return theAverage
> end averageOf
>
>
> on IfElseTree(n)
> 	if n = 1 then
> 		return 1
> 	else
> 		if n = 2 then
> 			return 2
> 		else
> 			if n = 3 then
> 				return 3
> 			else
> 				if n = 4 then
> 					return 4
> 				else
> 					if n = 5 then
> 						return 5
> 					else
> 						if n = 6 then
> 							return 6
> 						else
> 							if n = 7 then
> 								return 7
> 							else
> 								if n = 8 then
> 									return 8
> 								else
> 									if n = 9 then
> 										return 9
> 									else
> 										if n = 10 then
> 											return 10
> 										else
> 											if n = 11 then
> 												return 11
> 											else
> 												if n = 12 then
> 													return 12
> 												else
> 													if n = 13 then
> 														return 13
> 													else
> 														return -1
> 													end if
> 												end if
> 											end if
> 										end if
> 									end if
> 								end if
> 							end if
> 						end if
> 					end if
> 				end if
> 			end if
> 		end if
> 	end if
> end IfElseTree
>
> on StraightIF(n)
> 	if n = 1 then return 1
> 	if n = 2 then return 2
> 	if n = 3 then return 3
> 	if n = 4 then return 4
> 	if n = 5 then return 5
> 	if n = 6 then return 6
> 	if n = 7 then return 7
> 	if n = 8 then return 8
> 	if n = 9 then return 9
> 	if n = 10 then return 10
> 	if n = 11 then return 11
> 	if n = 12 then return 12
> 	if n = 13 then return 13
> 	if n > 13 then return -1
> end StraightIF
>
>
> on BinarySearchIF(n)
> 	if n < 6 then -- 1-6
> 		if n < 4 then -- 1-3
> 			if n = 1 then
> 				return 1
> 			else
> 				if n = 2 then
> 					return 2
> 				else
> 					return 3
> 				end if
> 			end if
> 		else -- 4-6
> 			if n = 4 then
> 				return 4
> 			else
> 				if n = 5 then
> 					return 5
> 				else
> 					return 6
> 				end if
> 			end if
> 		end if
> 	else -- 7-13
> 		if n < 10 then -- 7-9
> 			if n = 7 then
> 				return 7
> 			else
> 				if n = 8 then
> 					return 8
> 				else
> 					return 9
> 				end if
> 			end if
> 		else -- 10-13
> 			if n < 12 then --10 or 11
> 				if n = 10 then
> 					return 10
> 				else
> 					return 11
> 				end if
> 			else -- 12 or 13
> 				if n = 12 then
> 					return 12
> 				else
> 					if n = 13 then
> 						return 13
> 					else
> 						return -1
> 					end if
> 				end if
> 			end if
> 		end if
> 	end if
> end BinarySearchIF
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> AppleScript-Users mailing list      (email@hidden)
> Help/Unsubscribe/Update your Subscription:
> Archives: http://lists.apple.com/archives/applescript-users
>
> This email sent to email@hidden


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
AppleScript-Users mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
Archives: http://lists.apple.com/archives/applescript-users

This email sent to email@hidden


  • Follow-Ups:
    • Re: The Case of the Missing Case Statement
      • From: email@hidden
References: 
 >The Case of the Missing Case Statement (From: "S. J. Cunningham" <email@hidden>)

  • Prev by Date: Re: passing a list to FMPro from Mail
  • Next by Date: Re: The Case of the Missing Case Statement
  • Previous by thread: The Case of the Missing Case Statement
  • Next by thread: Re: The Case of the Missing Case Statement
  • Index(es):
    • Date
    • Thread