Solved Can you make this code more efficient?

Discussion in 'Spigot Plugin Development' started by KevinDasPikachu, Aug 8, 2020.

  1. I am developing a plugin with my friend who says this part of it that I wrote is way too CPU
    resource-consuming. He is more experienced and is usually right with this but is it really this resource-consuming? And if so, how would I make it more efficient? I already ordered it by probability.
    Here is my event:
    Code (Java):
    package HLG.SkyBlock.Listener;

    import org.bukkit.Material;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerInteractEvent;

    public class LS_Lock implements Listener
    {
        @EventHandler
        public void event (PlayerInteractEvent e)
        {
            Material clickedBlock = e.getClickedBlock().getType();
           
            Material[] betten = {Material.BLACK_BED, Material.BLUE_BED, Material.BROWN_BED, Material.CYAN_BED, Material.GRAY_BED, Material.GREEN_BED,
                    Material.LIGHT_BLUE_BED, Material.LIGHT_GRAY_BED, Material.LIME_BED, Material.MAGENTA_BED, Material.ORANGE_BED, Material.PINK_BED,
                    Material.PURPLE_BED, Material.RED_BED, Material.WHITE_BED, Material.YELLOW_BED};
           
            Material[] türen = {Material.ACACIA_DOOR, Material.BIRCH_DOOR, Material.CRIMSON_DOOR, Material.DARK_OAK_DOOR, Material.IRON_DOOR,
                    Material.JUNGLE_DOOR, Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.WARPED_DOOR};

            Material[] zauntüren = {Material.ACACIA_FENCE_GATE, Material.BIRCH_FENCE_GATE, Material.CRIMSON_FENCE_GATE, Material.DARK_OAK_FENCE_GATE,
                    Material.JUNGLE_FENCE_GATE, Material.OAK_FENCE_GATE, Material.SPRUCE_FENCE_GATE, Material.WARPED_FENCE_GATE};
           
            Material[] tische = {Material.CRAFTING_TABLE, Material.LOOM, Material.ENCHANTING_TABLE, Material.SMITHING_TABLE};
           
            Material[] kisten = {Material.CHEST, Material.ENDER_CHEST, Material.BARREL};
           
            Material[] öfen = {Material.BLAST_FURNACE, Material.SMOKER, Material.FURNACE};
           
            Material[] andere = {Material.ANVIL, Material.BELL, Material.LODESTONE, Material.NOTE_BLOCK, Material.CAULDRON, Material.COMPOSTER,
                    Material.SPAWNER, Material.STONECUTTER, Material.RESPAWN_ANCHOR, Material.GRINDSTONE, Material.BREWING_STAND};
           
            if (clickedBlock != null)
            {
                for (Material kiste : kisten)
                {
                    if (clickedBlock == kiste)
                    {
                       
                    }
                    else
                    {
                        for (Material ofen : öfen)
                        {
                            if (clickedBlock == ofen)
                            {
                               
                            }
                            else
                            {
                                for (Material tisch : tische)
                                {
                                    if (clickedBlock == tisch)
                                    {
                                       
                                    }
                                    else
                                    {
                                        for (Material bett : betten)
                                        {
                                            if (clickedBlock == bett)
                                            {
                                               
                                            }
                                            else
                                            {
                                                for (Material tür : türen)
                                                {
                                                    if (clickedBlock == tür)
                                                    {
                                                       
                                                    }
                                                    else
                                                    {
                                                        for (Material zauntür : zauntüren)
                                                        {
                                                            if (clickedBlock == zauntür)
                                                            {
                                                               
                                                            }
                                                            else
                                                            {
                                                                for (Material anderes : andere)
                                                                {
                                                                    if (clickedBlock == anderes)
                                                                    {
                                                                       
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }          
                }
            }
        }
    }
     
     
  2. Choco

    Moderator

    Wow, uh... yeah, that's a thing. a thing you definitely don't need to be doing.

    Define some EnumSet constants in your class so you don't have to create an array every single time. Additionally, an EnumSet has a #contains() method which should make lookup checks O(1) (significantly quicker than the O(n) worst case you have right now).

    Code (Java):
    private static final Set<Material> DOORS = EnumSet.of(Material.OAK_DOOR, Material.ACACIA_DOOR, /* etc. */);
    private static final Set<Material> BEDS = EnumSet.of(Material.BLACK_BED, Material.RED_BED, /* etc. */);

    yourMethod() {
        if (DOORS.contains(material)) {

        } else if (BEDS.contains(material)) {

        }
        // so on and so forth
    }
    Additionally, there are already some pre-defined sets of blocks in the Tag interface so you may use those if you'd like.
     
    • Agree Agree x 4
  3. Thanks for your help!
     
  4. If and else
     
  5. Auxilor

    Supporter

    good lord yanderedev is that you