簡體   English   中英

是否有可能使此Java代碼效率更高?

[英]Is it possible to make this java code far more efficient?

下面的代碼花費27秒的時間來加載51張圖像,每個圖像大約22 KB(在我插入的開始和結束警報之間計時)。 是否有可能使其效率更高(我希望將其縮短到3秒以內)?

起初我以為是數據庫,所以我把警報放進去以確保它是這段代碼。

問候,

格林

public void renderYMAwardsTable(List<YouthMemberAwards> ymAwardsList) {
    if (!ymAwardsList.isEmpty()) {

        flexTableLink.clear();
        int linkRow = 0;
        int linkCol = 0;
        flexTableLeadership.clear();
        int leadershipRow = 0;
        int leadershipCol = 0;
        flexTableBoomerang.clear();
        int boomerangRow = 0;
        int boomerangCol = 0;
        flexTableAchievement.clear();
        int achievementRow = 0;
        int achievementCol = 0;
        flexTableSpecialInterest.clear();
        int specialInterestRow = 0;
        int specialInterestCol = 0;
        totalAwards = 0;


        Window.alert("Start populating page.");
        for (final YouthMemberAwards ymAwards : ymAwardsList) {
            // Display awards and, if applicable, date awarded

            if (((ymAwards.getCaAwardedDate() != null)
                    || (ymAwards.getAwArchivedDate() == null)
                    || (ymAwards.getCaAwardStarted().equals("Y"))
                    ) && (ymAwards.getAwStartedDate().before(ymEndDate))) {

                //Display each award in the correct area with:
                //  the date awarded, if applicable, and
                //  the date box shaded if the award has been started but not awarded

                String imageDataString = ymAwards.getAwAwardPicture();
                Image image = new Image(imageDataString);
                image.setWidth("75px");
                image.setHeight("75px");
                image.setStyleName("gwt-Selectable");

                final DateBox awardedDate = new DateBox();
                awardedDate.setFormat(new DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy")));
                awardedDate.setValue(ymAwards.getCaAwardedDate());
                awardedDate.setWidth("75px");
                awardedDate.setFireNullValues(true);                    
                //Check if the Youth Member has started the Award,
                //if they have then colour the date box Green.
                if (ymAwards.getCaAwardStarted()!= null){
                    if ((ymAwards.getCaAwardedDate() == null)
                            && (ymAwards.getCaAwardStarted().equals("Y"))){
                        awardedDate.setStyleName("gwt-Green-Background");
                    }else{
                        awardedDate.setStyleName("gwt-Label-Login");
                    }
                }else{
                    awardedDate.setStyleName("gwt-Label-Login");
                }

                //Tally the number of Awards the Youth Member has been awarded.
                if (ymAwards.getCaAwardedDate() != null){
                    totalAwards = totalAwards + 1;
                }

                //Display each Award in the appropriate category.
                if (ymAwards.getAwAwardType().equals("Link")){

                    flexTableLink.setWidget(linkRow, linkCol, image);
                    flexTableLink.setWidget(linkRow + 1, linkCol, awardedDate);
                    if (linkCol < 10){
                        linkCol = linkCol + 1;
                    }else{
                        linkCol = 0;
                        linkRow = linkRow + 2;
                    }

                }else{
                    if (ymAwards.getAwAwardType().equals("Leadership")){

                        flexTableLeadership.setWidget(leadershipRow, leadershipCol, image);
                        flexTableLeadership.setWidget(leadershipRow + 1, leadershipCol, awardedDate);
                        if (leadershipCol < 10){
                            leadershipCol = leadershipCol + 1;
                        }else{
                            leadershipCol = 0;
                            leadershipRow = leadershipRow + 2;
                        }

                    }else{
                        if (ymAwards.getAwAwardType().equals("Boomerang")){

                            flexTableBoomerang.setWidget(boomerangRow, boomerangCol, image);
                            flexTableBoomerang.setWidget(boomerangRow + 1, boomerangCol, awardedDate);
                            if (boomerangCol < 10){
                                boomerangCol = boomerangCol + 1;
                            }else{
                                boomerangCol = 0;
                                boomerangRow = boomerangRow + 2;
                            }

                        }else{
                            if (ymAwards.getAwAwardType().equals("Achievement")){

                                flexTableAchievement.setWidget(achievementRow, achievementCol, image);
                                flexTableAchievement.setWidget(achievementRow + 1, achievementCol, awardedDate);
                                if (achievementCol < 10){
                                    achievementCol = achievementCol + 1;
                                }else{
                                    achievementCol = 0;
                                    achievementRow = achievementRow + 2;
                                }

                            }else{
                                if (ymAwards.getAwAwardType().equals("Special Interest")){

                                    flexTableSpecialInterest.setWidget(specialInterestRow, specialInterestCol, image);
                                    flexTableSpecialInterest.setWidget(specialInterestRow + 1, specialInterestCol, awardedDate);
                                    if (specialInterestCol < 10){
                                        specialInterestCol = specialInterestCol + 1;
                                    }else{
                                        specialInterestCol = 0;
                                        specialInterestRow = specialInterestRow + 2;
                                    }

                                }else{
                                    //If not found then default to Special Interest.

                                    flexTableSpecialInterest.setWidget(specialInterestRow, specialInterestCol, image);
                                    flexTableSpecialInterest.setWidget(specialInterestRow + 1, specialInterestCol, awardedDate);
                                    if (specialInterestCol < 10){
                                        specialInterestCol = specialInterestCol + 1;
                                    }else{
                                        specialInterestCol = 0;
                                        specialInterestRow = specialInterestRow + 2;
                                    }

                                }
                            }
                        }
                    }
                }

                //Add a click handler to the image
                image.addClickHandler(new ClickHandler(){

                    public void onClick(ClickEvent event){
                        //Store the data from this view for use in subsequent Views (ScoutAwardView).
                        AsyncCallback<ViewData> callback = new ViewDataStoreHandler<ViewData>();
                        rpc.setViewData(accountId, accountLevel, youthMemberID, ymAwards.getAwId(), "0", callback);

                        //If the Award has sub groups then display the Groups and allow one the 
                        //be selected to display the details. Otherwise, display the details.
                        if (ymAwards.getAwGrouped().equals("Y")) {
                            //Go to the AwardGroupView
                            navHandler2.go("AwardGroup");
                        }else{
                            //Go to the ScoutAwardView
                            navHandler2.go("ScoutAward");
                        }

                    }
                });

                //Add change handler for the awarded date.
                //Only a Leader or Administrator can update the date
                if (accountLevel.equals("Leader") || accountLevel.equals("Administrator")) {
                    awardedDate.addValueChangeHandler(new ValueChangeHandler<java.util.Date>() {
                        public void onValueChange(ValueChangeEvent<java.util.Date> event) {
                            //Check for a null date and handle it for dateBoxArchived and dateBoxPackOut
                            java.sql.Date sqlDateAwarded = awardedDate.getValue() == null ? null : new java.sql.Date(awardedDate.getValue().getTime());
                            AsyncCallback<Void> callback = new YMAwardedDateHandler<Void>();
                            rpc.updateYMAwarded(youthMemberID, ymAwards.getAwId(), sqlDateAwarded, callback);

                            @SuppressWarnings("unused")
                            AdjustAwardStock adjustAwardStock = new AdjustAwardStock(sqlDateAwarded, ymAwards.getAwId());
                        }
                    });
                }
            }
        }
    }
    Window.alert("Finish populating page.");
    //Hide "Loading please wait" popup. 
    popup.hide();

    //Display the number of Awards earned.
    String totalAwardsString = Integer.toString(totalAwards);
    textBoxTotalAwards.setText(totalAwardsString);
}

首先,75x75像素大小的圖像不應為22kB。 即使是這種大小的PNG-24圖像也大約為3kB,更不用說GIF了。 以正確的尺寸和適當的文件格式(使用PNG或GIF)存儲圖像。 對於51張圖像,這意味着1MB和150kB之間的差異。 這是第一個重大改進。

其次,如果使用有限數量的圖像,請將它們組合為一個精靈。 這會將往返服務器調用的次數從51(在您的示例中)減少到1。這是另一個巨大的改進。

您無需手動制作此精靈(除非您願意)。 您可以使用GWT的ImageResource ClientBundle 請注意,可以緩存此精靈,因此瀏覽器不需要在用戶每次訪問此頁面時加載它。

其他建議(例如使用switch語句)對於代碼的可讀性和維護性很有好處,但是由於您的Java代碼已編譯為JavaScript,並且編譯器非常智能,因此它們不會顯着提高性能。

為了合並圖像和其他JS文件,您始終可以使用瀏覽器支持的gzip功能,以便可以壓縮所有文件並將其發送到瀏覽器以解壓縮。 這將花費大量的網絡時間,並且傳輸的數據大小將大大減少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM