• 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: "S. J. Cunningham" <email@hidden>
  • Date: Sun, 05 Apr 2015 06:17:33 -0400

LOL!  Where does "OMG" get translated into "Oh My God"?

I overlooked "else if" because Script Debugger doesn't include it in it's pre-defined paste commands.  I agree it looks a lot cleaner. and I'll be using it a lot more in the future.

As far as just writing code that is clear, that's good engineering advice since the code is usually just a means to an end.  However I like to understand how things work also.  Asking that question has many times led me to discovering better techniques and/or ones that I wasn't aware of.  "Just don't worry about it" is not a very satisfying answer to why executing 296K if-then statements takes longer than executing 520K of them.


On Apr 5, 2015, at 1:44 AM, email@hidden wrote:

> Jon Pugh is of course totally right. My first attempt was to make the code readable, then if you have anything special for your “segments” of use-cases, then you just comment the segments, within the nested if test.
>
> -- More like a case, since now, omitting an exit repat will
> -- work like omitting a break, allowing you to adjust the value,
> -- so you can jump through more conditions, like a case statement works in most
> -- languages, except for java I believe
>
> on jumpTableFor1by13(n)
> 	repeat
> 		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
> 			say "OMG"
> 			set n to 5
> 		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 repeat
> end jumpTableFor1by13
> 5. apr. 2015 kl. 07:34 skrev email@hidden:
>
>> 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


 _______________________________________________
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: Shane Stanley <email@hidden>
    • 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>)
 >Re: The Case of the Missing Case Statement (From: email@hidden)
 >Re: The Case of the Missing Case Statement (From: email@hidden)

  • Prev by Date: Re: The Case of the Missing Case Statement
  • Next by Date: Re: The Case of the Missing Case Statement
  • Previous by thread: Re: The Case of the Missing Case Statement
  • Next by thread: Re: The Case of the Missing Case Statement
  • Index(es):
    • Date
    • Thread