方法的表现 [英] Performance of method

查看:74
本文介绍了方法的表现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我单独调用它时,我会调用某种方法,它需要11523纳秒的平均值(10000次调用)但是当我从另一个类的上下文中调用它时需要大约95721

I am calling a certain method when i call it alone using a it take an average (for 10000 call) of 11523 nano second but when i call it from a context of another class it take about 95721

方法体是

public static byte [] validateRequest(KARPPacket karpPacket)
{

try {
    long before,time;
    before =System.nanoTime();


    byte [] encryptedTicket=karpPacket.getTicket();
    byte[] decryptedTicket=null;
    if(encryptedTicket==null)
        return null;
    if(encryptedTicket.length%16==0)
    {



        decryptedTicket = Encryptor.decrypt(encryptedTicket, ClientWindow.getSecretKey());
        time=System.nanoTime()-before;
        System.out.println(time);

         if(karpPacket.getSenderProtocolAddressAsString().equals(getSrcAddressFromTicket(decryptedTicket)))
         {
            ClientTicketManager.getArpCash().put(karpPacket.getSenderProtocolAddressAsString(), karpPacket.getSenderHardwareAddressFormatted());


            return decryptedTicket;
         }


       return decryptedTicket;


    }

    return null;

    } catch (Exception e) {

        e.printStackTrace();
        return null;
    } 

为什么会这样以及如何改善其性能。
我希望这个代码足够

why is that and how to improve its performance. I hope this enough code

这里是encryptor.decrypt方法

here is the encryptor.decrypt method

public static byte[] decrypt(byte [] encryptedByteArray,String keyString)throws NoSuchAlgorithmException, 
                                                            NoSuchPaddingException, InvalidKeyException,
                                                            IllegalBlockSizeException, BadPaddingException
{
    SecretKey key=loadKey(keyString);

byte[] clearByteArray;

Cipher dCipher=Cipher.getInstance("AES");
dCipher.init(Cipher.DECRYPT_MODE,key );
clearByteArray=dCipher.doFinal(encryptedByteArray);
return clearByteArray;

}

和加载密钥

public static SecretKey loadKey(String  keyString)  {


            byte[] encoded = keyString.getBytes();

            SecretKey key = new SecretKeySpec(encoded, "AES");
            return key;
        }

运行验证请求方法的其他上下文

the other context at which a run the validate request method

package karp.client;

import java.awt.Color;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.util.Date;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.swing.JOptionPane;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

import karp.client.presentation.ClientWindow;
import karp.client.util.Constants;
import karp.generalutil.common.Encryptor;
import karp.generalutil.destination.TicketDestination;
import karp.packet.KARPPacket;

public class KARPMessageHandlerP {

    String localIpAddress=null;
    ClientTicketManager clientTicketManager;
    KARPSender karpRequestSender=new KARPSender();  

byte [] srcMac;
NetworkInterface network;

    public KARPMessageHandlerP(KARPPacket karpPacket)
    {


        try
        {

            long before,time;


            localIpAddress=KARPReciever.localIpAddress;
            clientTicketManager=KARPReciever.clientTicketManager;

             srcMac = KARPReciever.srcMac;

//          



        if(karpPacket.getOperation()==KARPPacket.ARP_REPLY)
        {

            if(karpPacket.getSenderProtocolAddressAsString().equals(localIpAddress))//request sent by client
            {

                // if the reply was sent by the client no action must be taken.

            }
            else
            {

         if(karpPacket.getTargetProtocolAddressAsString().equals(localIpAddress))
         {
         byte [] ticket=karpPacket.getTicket();
         if(ticket==null)
         {   

         //delete the new entry from cash  and refresh the cash
          deleteEntry(karpPacket.getSenderProtocolAddressAsString());





         }
         else
         {


             if(validateReply(karpPacket) )
             {

                  }  
             else
             {


                 deleteEntry(karpPacket.getSenderProtocolAddressAsString());

                 //delete entry and refresh cash
             }

         }

            }
        }
        }

        else
            if(karpPacket.getOperation()==KARPPacket.ARP_REQUEST)
            {


                if(karpPacket.getSenderProtocolAddressAsString().equals(localIpAddress))//request sent by client
                    {
    //1             
                    if(karpPacket.getTicket()!=null)
                    {
                    //custom request no need to add;    


                    }
    //2         
                    else //new request need to add ticket 
                    {
                        String destinationId=(karpPacket.getTargetProtocolAddressAsString());
                        // if the map contain ticket to destination add the ticket directly
    //2-1               
                        KARPPacket customKarpPacket;
                        byte [] ticketDestinationByte=null;
                        if(ClientTicketManager.getDestinationTicketMap().containsKey(destinationId))
                        {
                             ticketDestinationByte=ClientTicketManager.getDestinationTicketMap().get(destinationId);
                                                    }
    //2-2                send ticket request
                        else
                        {   
                            ticketDestinationByte=clientTicketManager.getDestinationTicket(destinationId);



                        }
                        if(ticketDestinationByte!=null)
                        {

                        customKarpPacket= karpRequestSender.createKARPPacket(karpPacket.getDstAddress(), karpPacket.getSrcAddress(), 
                                                                            InetAddress.getLocalHost().getAddress(), karpPacket.getTargetProtoAddr(),
                                                                            karpPacket.getTargetHardAddr(),
                                                                            ticketDestinationByte, KARPPacket.ARP_REQUEST);


                        karpRequestSender.sendKARPPacket(customKarpPacket);
                        }

                    }
                    }
                else
                {
                    if(karpPacket.getTargetProtocolAddressAsString().equals(localIpAddress))//check to see if the request is for the client
                    {

                    byte [] ticketRequest=validateRequest(karpPacket);
                    if(ticketRequest!=null)
                    {

                        //reply to the request;

                        String sessionKey=getSessionKeyFromTicket(ticketRequest);

                        TicketDestination ticketDestination=new TicketDestination();

                        ticketDestination.setDestinationId(karpPacket.getSenderProtocolAddressAsString());
                        ticketDestination.setSourceId(karpPacket.getTargetProtocolAddressAsString());
                        ticketDestination.setSourceDestinationKey(sessionKey);
                        byte [] ticketDestinationByte=ticketDestination.getAsByte();
                        byte [] encryptedTicketDestination=Encryptor.encrypt(ticketDestinationByte, sessionKey);


                        ///need to review target hardware address

                        KARPPacket karpPacketReply=karpRequestSender.createKARPPacket(karpPacket.getSrcAddress(), srcMac, InetAddress.getLocalHost().getAddress(), karpPacket.getSenderProtoAddr(),karpPacket.getSrcAddress(), encryptedTicketDestination, KARPPacket.ARP_REPLY);

                        karpRequestSender.sendKARPPacket(karpPacketReply);

                    }   
                    else //delete ticket invalid request
                    {
                         deleteEntry(karpPacket.getSenderProtocolAddressAsString());

                    }


                }
                }
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        //System.out.println(timeConsumed);
    }


    public static byte [] validateRequest(KARPPacket karpPacket)
    {
        try {
            long before,time;
            before =System.nanoTime();


            byte [] encryptedTicket=karpPacket.getTicket();
            byte[] decryptedTicket=null;
            if(encryptedTicket==null)
                return null;
            if(encryptedTicket.length%16==0)
            {



                decryptedTicket = Encryptor.decrypt(encryptedTicket, ClientWindow.getSecretKey());
                time=System.nanoTime()-before;
                System.out.println(time);

                 if(karpPacket.getSenderProtocolAddressAsString().equals(getSrcAddressFromTicket(decryptedTicket)))
                 {
                    ClientTicketManager.getArpCash().put(karpPacket.getSenderProtocolAddressAsString(), karpPacket.getSenderHardwareAddressFormatted());


                    return decryptedTicket;
                 }


               return decryptedTicket;


            }

            return null;

            } catch (Exception e) {

                e.printStackTrace();
                return null;
            } 


    }


    public boolean validateReply(KARPPacket karpPacket) throws InvalidKeyException, NoSuchAlgorithmException,
    NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException
    {


//      KARPReciever.stop=true;
//      for(int i=0;i<10000;i++)
//          {

        String sessionKey;
         byte[] encryptedTicket=karpPacket.getTicket();

            if(ClientTicketManager.getDestinationKeyMap().containsKey(karpPacket.getSenderProtocolAddressAsString()))
            {
        sessionKey=ClientTicketManager.getDestinationKeyMap().get(karpPacket.getSenderProtocolAddressAsString());
         byte[] decryptedTicket=Encryptor.decrypt(encryptedTicket, sessionKey);

         if(karpPacket.getSenderProtocolAddressAsString().equals(getSrcAddressFromTicket(decryptedTicket)))
         {
            ClientTicketManager.getArpCash().put(karpPacket.getSenderProtocolAddressAsString(), karpPacket.getSenderHardwareAddressFormatted());

//          after=System.nanoTime();
//           timeConsumed=(after-before);
//          System.out.print("kl"+timeConsumed);
            return true;
         }
            }
            //}


        return false;
    }

    public void deleteEntry(String entryIpAddress)
    {
        try
        {



        if(!ClientTicketManager.getAuthenticatedUser().contains(entryIpAddress))
        {
        if(ClientTicketManager.getArpCash().containsKey(entryIpAddress))
        {
        String updateCommand="arp -s "+entryIpAddress+" "+clientTicketManager.getArpCash().get(entryIpAddress);

        //printCash();
        Runtime.getRuntime().exec(updateCommand);   
        }
        else
        {   
         String deleteCommand ="arp -d "+entryIpAddress;
         Runtime.getRuntime().exec(deleteCommand); 
        }
        }
        }
        catch(Exception e)
        {

        }



    }

    public static String getSrcAddressFromTicket(byte [] ticket)
    {

        byte [] srcByte=new byte[4];
        System.arraycopy(ticket, 16, srcByte, 0, 4);


        String srcString=TicketDestination.getIpAddressAsString(srcByte);
        return srcString;
    }

    public String getSessionKeyFromTicket(byte [] ticket)
    {
        byte [] sessionKeyByte=new byte[16];
        System.arraycopy(ticket, 0, sessionKeyByte,0, 16);
        return new String(sessionKeyByte);
    }

    public void printCash()
    {
        for(Object entry:ClientTicketManager.getArpCash().entrySet().toArray())
        {
            System.out.println(entry+" "+clientTicketManager.getArpCash().get(entry)+" entry in cash ");
        }
    }

}


推荐答案

当你预热代码时,它会根据它的使用方式变得更快。

When you warm up the code it get faster, based on how it is used.

第一次运行代码时,它非常慢,它必须加载类并初始化它们。

The first time you run it, it is very slow, it has to load classes and initialise them.

当您重复运行代码时,不仅预热代码并且触发部分编译它也是在缓存中更温暖,例如L1访问速度比主存储器访问速度快100倍。

As you run the code repeatedly, it is not only warming up the code and triggering portions to compile it is also going to be warmer in cache e.g. a L1 access can be 100x faster than a main memory access.

如果运行代码10K或20K次,所有代码将在缓存中编译并加热预测工作得很好。

If you run the code 10K or 20K times, all the code will be compiled and warm in cache with branch prediction working nicely.

即便如此,如果您上下文切换并执行其他操作,您会看到再次减速,因为您的缓存不是那么温暖。您可以看到减速幅度高达2-5倍。

Even then if you context switch and perform other operations you see a slow down again as your caches are not so warm. You can see a slow down of as much as 2-5x.

BTW还有其他因素,如资源瓶颈,CPU为了节省电力而降低运行速度频率。

BTW There are other factors such a resource bottlenecks, CPU powering themselves down to save power and running at lower frequencies.

这篇关于方法的表现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆