Fastest way to test that a character value contains nothing

When you want to verify that a character value does not contain any character (i.e. it is "" or ?), using the construct TRUE <> (someCharacterExpression > "") is your best buy (unless, in the specific context, you're certain that someCharacterExpression will have a value of "" most of the time).

You can have some fun confirming this with the following code (it could take ~30 seconds to run) that shows 4 different ways to accomplish this task and the run time according to the value of someCharacterExpression (either "", ?, or any string):

DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
DEFINE VARIABLE ct AS CHARACTER NO-UNDO.
DEFINE VARIABLE cResult AS CHARACTER NO-UNDO.
DEFINE VARIABLE iETIME AS INTEGER NO-UNDO.
DEFINE VARIABLE iLoopTime AS INTEGER NO-UNDO.
&SCOPED-DEFINE LoopSize 1000000

ETIME(TRUE).
DO i = 1 TO {&LoopSize}:
END.
iLoopTime = ETIME. /* loop execution time */

DO j = 1 TO 3:
  CASE j:
    WHEN 1 THEN ASSIGN 
     ct = ""
     cResult = "For void: ".
    WHEN 2 THEN ASSIGN 
     ct = ?
     cResult = cResult + "~nFor ---?: ".
    WHEN 3 THEN ASSIGN 
     ct = "asilhjdgfikh sdf lsidfh kldsf"
     cResult = cResult + "~nFor char: ".
  END CASE.

  ETIME(TRUE).
  DO i = 1 TO {&LoopSize}:
    (ct > "") <> TRUE. /* 1 */
  END.
  iETIME = ETIME.
  
  cResult = cResult + "   #1 = " + STRING(iETIME - iLoopTime).
  
  ETIME(TRUE).
  DO i = 1 TO {&LoopSize}:
    (ct = ? OR ct = "":U). /* 2 */
  END.
  iETIME = ETIME.
  
  cResult = cResult + "   #2 = " + STRING(iETIME - iLoopTime).
  
  ETIME(TRUE).
  DO i = 1 TO {&LoopSize}:
    (ct = "":U OR ct = ?). /* 3 */
  END.
  iETIME = ETIME.
  
  cResult = cResult + "   #3 = " + STRING(iETIME - iLoopTime).
  
  ETIME(TRUE).
  DO i = 1 TO {&LoopSize}:
    TRUE <> (ct > ""). /* 4 */
  END.
  iETIME = ETIME.
  
  cResult = cResult + "   #4 = " + STRING(iETIME - iLoopTime).
END.

MESSAGE cResult VIEW-AS ALERT-BOX.

Note that TRUE <> (someCharacterExpression > "") is consistently faster than (someCharacterExpression > "") <> TRUE. (interesting...)

Here's a couple of results on my machine:
For void: #1 = 812 #2 = 1016 #3 = 578 #4 = 781
For ---?: #1 = 672 #2 = 594 #3 = 875 #4 = 593
For char: #1 = 844 #2 = 1031 #3 = 1031 #4 = 766

For void: #1 = 812 #2 = 1016 #3 = 578 #4 = 734
For ---?: #1 = 657 #2 = 593 #3 = 875 #4 = 610
For char: #1 = 843 #2 = 1016 #3 = 1047 #4 = 750

For void: #1 = 828 #2 = 1016 #3 = 578 #4 = 750
For ---?: #1 = 656 #2 = 594 #3 = 859 #4 = 610
For char: #1 = 828 #2 = 1031 #3 = 1031 #4 = 766