Here's what I came up with:

Query ClassListAll() As %SQLQuery
{
SELECT Name
FROM %Dictionary.ClassDefinition
}

Query ClassListNS(namespace) As %SQLQuery
{
SELECT Name
FROM %Dictionary.ClassDefinitionQuery_SubclassOf('%XML.Adaptor') c
WHERE 1=1
    AND EXISTS (SELECT 1
                FROM %Dictionary.ParameterDefinition
                WHERE parent = c.Name
                AND Name = 'NAMESPACE'
                AND _Default = :namespace)
}

/// Should be rewritten to return only non-empty namespaces
Query NSList() As %SQLQuery
{
SELECT DISTINCT _Default Name
FROM %Dictionary.ParameterDefinition
WHERE 1=1
    AND Name = 'NAMESPACE'
}

/// do ##class().ExportAllSchemas()
ClassMethod ExportAllSchemas()
{
    set rs = ..NSListFunc()
    while rs.%Next() {
        write "Exporting: ", rs.Name,!
        do ..ExportSchema(rs.Name)
    }
}

/// do ##class().ExportSchema()
ClassMethod ExportSchema(namespace)
{
    kill %objlasterror
    set schema=##class(%XML.Schema).%New()
    set schema.DefaultNamespace=namespace

    
    #dim empty As %Boolean = $$$YES
    #dim rs As %SQL.ISelectResult
    set rs = ..ClassListNSFunc(namespace)
    while rs.%Next() {
        set empty = $$$NO
        set sc = schema.AddSchemaType(rs.Name)
        write:$$$ISERR(sc) $System.Status.GetErrorText(sc)
    }
    if empty {
        write "Empty namespace",!
        quit
    }
    
    do ..AddImports(namespace, schema)
    
    set schema=schema.GetSchema(namespace)

    #dim writer As %XML.Writer = ##class(%XML.Writer).%New()
    set writer.NoXMLDeclaration = $$$YES
    set writer.Indent = $$$YES
    set writer.SuppressXmlns = $$$YES
    do writer.AddSchemaNamespace("s")
    do writer.OutputToFile(..NsToFullFileName(namespace))

    do writer.AddSchemaNamespace()
    do writer.AddNamespace(namespace)

    set sc = writer.DocumentNode(schema)
    write:$$$ISERR(sc) $System.Status.GetErrorText(sc)
}

ClassMethod AddImports(namespace, schema As %XML.Schema)
{
    set rs = ..NSListFunc()
    while rs.%Next() {
        set curNS = rs.Name
        continue:curNS=namespace
        do schema.DefineLocation(curNS, ..NsToLocalFileName(curNS))
    }
}

ClassMethod NsToFullFileName(namespace) As %String [ CodeMode = expression ]
{
##class(%File).SubDirectoryName($system.Util.ManagerDirectory(), "Temp", 1) _ ..NsToLocalFileName(namespace)
}

ClassMethod NsToLocalFileName(namespace) As %String [ CodeMode = expression ]
{
..NsToFileName(namespace) _ ".xsd"
}

ClassMethod NsToFileName(namespace) As %String [ CodeMode = expression ]
{
$p(namespace, "/", *-1)
}

Interesting article.

Note that comparison with 1 would always be the fastest regardless of where it is:

Here's your code on my PC:

Time for If: .037652 seconds
Time for ElseIf #1: .045029 seconds
Time for ElseIf #2: .057766 seconds
Time for Else: .053267 seconds

And here's a modified code with comparison to 1 third:

ClassMethod Run3()
{
    For i=1:1:4 {
        Set time(i,"start")=$zh
        For j=1:1:1000000 {
            If i=3 {
                set a=1
            } ElseIf i=2 {
                set a=1
            } ElseIf i=1 {
                set a=1
            } Else {
                set a=1
            }
        }
        Set time(i,"end")=$zh
    }
    
    W "Time for If: ",time(1,"end")-time(1,"start")," seconds",!
    W "Time for ElseIf #1: ",time(2,"end")-time(2,"start")," seconds",!
    W "Time for ElseIf #2: ",time(3,"end")-time(3,"start")," seconds",!
    W "Time for Else: ",time(4,"end")-time(4,"start")," seconds",!
}

Running this code yields these results:

Time for If: .109513 seconds
Time for ElseIf #1: .048419 seconds
Time for ElseIf #2: .029746 seconds
Time for Else: .059306 seconds

Regardless of where comparison to 1 happens it would be the fastest one.

a. Check that the JAR you import has the new code. If you build in a separate directory and then copy the JAR into a final directory it can fail as java locks loaded JAR files on OS level.

b. Try stopping all running Java Gateways before copying the JAR and running UploadJar. Do not create new gateway for every import.

c. What does

zw %objlasterror

report after (4)?

Create this class:

Class ABC.Try
{

/// w ##class(ABC.Try).PackageExists()
ClassMethod PackageExists(package = "ABC") As %Boolean [ CodeMode = expression ]
{
##class(%Dictionary.PackageDefinition).%ExistsId(package)
}

}

Test:

>w ##class(ABC.Try).PackageExists()
0

It also won't be available in GetPackageList

ABC.Try can also extend registered or persistent to the same effect.

Adapted from @Krishnamuthu Venkatachalam  answer

ClassMethod Rename(oldClass, newClass) As %Status
{
    #dim sc As %Status = $$$OK
    
    quit:'##class(%Dictionary.ClassDefinition).%ExistsId(oldClass) $$$ERROR($$$GeneralError, "Old class does not exist")
    quit:##class(%Dictionary.ClassDefinition).%ExistsId(newClass) $$$ERROR($$$GeneralError, "New class already exists")
    
    merge ^oddDEF(newClass) = ^oddDEF(oldClass)
    $$$defClassKeySet(newClass, $$$cCLASSname, newClass) // Set class name
    $$$defClassKeyKill(newClass, $$$cCLASSstorage) // Kill old storage
    
    do UpdClsDef^%occLibrary(newClass)
    
    set sc = $system.OBJ.Compile(newClass, "/displaylog=0 /displayerror=0")
    quit:$$$ISERR(sc) sc
    
    set sc = ##class(%Dictionary.ClassDefinition).%DeleteId(oldClass)
    
    quit sc
}