2011-05-27 97 views
2

以下代碼是我從黑莓論壇上拿下的,使用8500系列套裝上的BB PIM API創建2000個隨機聯繫人需要26分鐘的時間。有誰知道爲什麼需要這麼長時間,或者如何提高通訊簿中聯繫人創建的性能?黑莓PIM爲什麼聯繫人創作如此緩慢?

public static void testContactCreation() { 
    ContactList contacts = null; 
    try { 
     contacts = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE); 
    } catch (PIMException e) { 
     // An error occurred 
     return; 
    } 

    String arrSzCities[] = {"Birmingham", "Walsall", "Wolverhampton", "Banbury", "Bromsgrove", "Lichfield", "Balsall Heath", 
     "West Bromich", "Smethwick", "Scott Arms", "Perry Barr", "Small Heath", "Acocks Green", "Great Barr", 
     "Harborne", "Selly Oak", "Newtown", "Hockley", "Nuneaton", "Stafford", "Stoke", "Sandwell", "Brierly Hill", 
     "Longbridge", "Sutton Coldfield", "Tamworth", "Coventry", "Rugby", "Hall Green", "Olton", "Dorridge", 
     "Lapworth", "Shirley", "Wythall", "Warwick", "Dudley", "Barnt Green", "Tile Hill", "Berkswell", "Canley", 
     "Yardley", "Yardley Wood", "Bordesley Green", "Cosely", "Four Oaks", "Erdington", "Aston", "Duddington"}; 

    String arrSzCountries[] = {"England", "Wales", "Scotland", "Northern Ireland", "Eire", "Spain", "France", "Italy", 
     "Monaco", "Switzerland", "Austria", "Germany", "Lapland", "Estonia", "Hungary", "Slovakia", "Slovenia", 
     "Czech Republic", "Latvia", "Holland", "Belgium", "Luxembourg", "Iceland", "Finland", "Denmark", "Norway"}; 

    String arrSzFamilyNames[] = {"SMITH", "JOHNSON", "WILLIAMS", "BROWN", "JONES", "MILLER", "DAVIS", "GARCIA", "RODRIGUEZ", 
     "WILSON", "MARTINEZ", "ANDERSON", "TAYLOR", "THOMAS", "HERNANDEZ", "MOORE", "MARTIN", "JACKSON", "THOMPSON", 
     "WHITE", "LOPEZ", "LEE", "GONZALEZ", "HARRIS", "CLARK", "LEWIS", "ROBINSON", "WALKER", "PEREZ", "HALL", "YOUNG", 
     "ALLEN", "SANCHEZ", "WRIGHT", "KING", "SCOTT", "GREEN", "BAKER", "ADAMS", "NELSON", "HILL", "RAMIREZ", "CAMPBELL", 
     "MITCHELL", "ROBERTS", "CARTER", "PHILLIPS", "EVANS", "TURNER", "TORRES", "PARKER", "COLLINS", "EDWARDS", "STEWART", 
     "FLORES", "MORRIS", "NGUYEN", "MURPHY", "RIVERA", "COOK", "ROGERS", "MORGAN", "PETERSON", "COOPER", "REED", 
     "BAILEY", "BELL", "GOMEZ", "KELLY", "HOWARD", "WARD", "COX", "DIAZ", "RICHARDSON", "WOOD", "WATSON", "BROOKS", 
     "BENNETT", "GRAY", "JAMES", "REYES", "CRUZ", "HUGHES", "PRICE", "MYERS", "LONG", "FOSTER", "SANDERS", "ROSS", 
     "MORALES", "POWELL", "SULLIVAN", "RUSSELL", "ORTIZ", "JENKINS", "GUTIERREZ", "PERRY", "BUTLER", "BARNES", "FISHER", 
     "HENDERSON", "COLEMAN", "SIMMONS", "PATTERSON", "JORDAN", "REYNOLDS", "HAMILTON", "GRAHAM", "KIM", "GONZALES", 
     "ALEXANDER", "RAMOS", "WALLACE", "GRIFFIN", "WEST", 
     "COLE", "HAYES", "CHAVEZ", "GIBSON", "BRYANT", "ELLIS", "STEVENS", "MURRAY", "FORD", "MARSHALL", "OWENS", 
     "MCDONALD", "HARRISON", "RUIZ", "KENNEDY", "WELLS", "ALVAREZ", "WOODS", "MENDOZA", "CASTILLO", "OLSON", 
     "WEBB", "WASHINGTON", "TUCKER", "FREEMAN", "BURNS", "HENRY", "VASQUEZ", "SNYDER", "SIMPSON", "CRAWFORD", "JIMENEZ", 
     "PORTER", "MASON", "SHAW", "GORDON", "WAGNER", "HUNTER", "ROMERO", "HICKS", "DIXON", "HUNT", "PALMER", "ROBERTSON", 
     "BLACK", "HOLMES", "STONE", "MEYER", "BOYD", "MILLS", "WARREN", "FOX", "ROSE", "RICE", "MORENO", "SCHMIDT", "PATEL", 
     "FERGUSON", "NICHOLS", "HERRERA", "MEDINA", "RYAN", "FERNANDEZ", "WEAVER", "DANIELS", "STEPHENS", "GARDNER", "PAYNE", 
     "KELLEY", "DUNN", "PIERCE", "ARNOLD", "TRAN", "SPENCER", "PETERS", "HAWKINS", "GRANT", "HANSEN", "CASTRO", "HOFFMAN", 
     "HART", "ELLIOTT", "CUNNINGHAM", "KNIGHT"}; 

    String arrSzFirstNames[] = {"MARY", "PATRICIA", "LINDA", "BARBARA", "ELIZABETH", "JENNIFER", "MARIA", "SUSAN", "MARGARET", 
     "DOROTHY", "LISA", "NANCY", "KAREN", "BETTY", "HELEN", "SANDRA", "DONNA", "CAROL", "RUTH", "SHARON", "MICHELLE", 
     "LAURA", "SARAH", "KIMBERLY", "DEBORAH", "JESSICA", "SHIRLEY", "CYNTHIA", "ANGELA", "MELISSA", "BRENDA", "AMY", 
     "ANNA", "REBECCA", "VIRGINIA", "KATHLEEN", "PAMELA", "MARTHA", "DEBRA", "AMANDA", "STEPHANIE", "CAROLYN", "CHRISTINE", 
     "MARIE", "JANET", "CATHERINE", "FRANCES", "ANN", "JOYCE", "DIANE", "ALICE", "JULIE", "HEATHER", "TERESA", "DORIS", 
     "GLORIA", "EVELYN", "JEAN", "CHERYL", "MILDRED", "GERALD", "KEITH", "SAMUEL", 
     "JAMES", "JOHN", "ROBERT", "MICHAEL", "WILLIAM", "DAVID", "RICHARD", "CHARLES", "JOSEPH", "THOMAS", "CHRISTOPHER", 
     "DANIEL", "PAUL", "MARK", "DONALD", "GEORGE", "KENNETH", "STEVEN", "EDWARD", "BRIAN", "RONALD", "ANTHONY", 
     "KEVIN", "JASON", "MATTHEW", "GARY", "TIMOTHY", "JOSE", "LARRY", "JEFFREY", "FRANK", "SCOTT", "ERIC", "STEPHEN", 
     "ANDREW", "RAYMOND", "GREGORY", "JOSHUA", "JERRY", "DENNIS", "WALTER", "PATRICK", "PETER", "HAROLD", "DOUGLAS", 
     "HENRY", "CARL", "ARTHUR", "RYAN", "ROGER", "JOE", "JUAN", "JACK", "ALBERT", "JONATHAN", "JUSTIN", "TERRY"}; 

    String arrSzEmailProviders[] = {"google", "yahoo", "wanadoo", "freemail", "aol", "yellowmellow", "redmail", "bt", "tiscali", 
     "naims", "bulldog", "demon", "virgin", "sky", "orange", "vodaphone", "o2", "three", "britishgas", "npower", 
     "britishtelecom", "royalmail", "parcelforce", "dhl", "usps", "ford", "rover", "fiat", "seat", "volvo", "bmw", 
     "landrover", "jaguar", "warburtons", "kingsmill", "hovis", "walkers", "cadburys", "ironbru", "redbull", "jura"}; 

    String arrSzAlphas[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", 
     "U", "V", "W", "X", "Y", "Z"}; 

    String arrSzStreetSuffixes[] = {"Road", "Street", "Crescent", "Close", "Way", "Mews", "Common", "Alley", "Common", "Grove", 
     "Place", "Mill", "Manor", "Lane", "March", "Hill", "Park", "Passage", "Path", "Row", "Square", "Terrace", "View"}; 

    String arrSzStreetNames[] = {"High", "Station", "Main", "Park", "Church", "London", "Victoria", "Albert", "Green", "Manor", 
     "Church", "Park", "Queens", "New", "Grange Road", "Kings Road", "North", "West", "South", "East", "Windsor", 
     "Highfield", "Mill", "Alexander", "York", "St. John's", "Broad", "Springfield", "George", "Manchester", "Richmond", 
     "School", "Stanley", "Chester", "Aghaloo", "Picadilly", "**bleep**", "Wooburn", "Crazies", "Valentia", "Luton", "Croydon", 
     "Rookery", "Coronation", "Dawlish", "Tiverton", "Dartmouth", "Hubert", "Bristol", "Arley", "Grange", "Dale", 
     "Serpentine", "Bournebrook", "University", "Holly", "Kitchener", "Millner", "Westminster", "Cherrington", "Gristhorpe", 
     "Kensington", "Cartland", "Horatio", "Ethelbert", "Hornblower", "Hanky Panky", "Bewdley", "Acorn", "Berry", "Moor", 
     "Brent", "Mungo Jerry", "Highbury", "Howell", "Tenbury", "Peacock", "Hartswell"}; 

    Random generator = new Random(1628434416); 
    for (int i = 0; i < 2000; i++) { 
     Contact contact = contacts.createContact(); 
     String[] addr = new String[contacts.stringArraySize(Contact.ADDR)]; 
     String[] szName = new String[contacts.stringArraySize(Contact.NAME)]; 

     // Family Name 
     if (contacts.isSupportedArrayElement(Contact.NAME, Contact.NAME_FAMILY)) 
     szName[Contact.NAME_FAMILY] = arrSzFamilyNames[generator.nextInt(arrSzFamilyNames.length)]; 
     // First Name 
     if (contacts.isSupportedArrayElement(Contact.NAME, Contact.NAME_GIVEN)) 
     szName[Contact.NAME_GIVEN] = arrSzFirstNames[generator.nextInt(arrSzFirstNames.length)]; 
     // Add name to contact 
     contact.addStringArray(Contact.NAME, PIMItem.ATTR_NONE, szName); 

     // Postcode (UK format) 
     if (contacts.isSupportedArrayElement(Contact.ADDR, Contact.ADDR_POSTALCODE)) 
     addr[Contact.ADDR_POSTALCODE] = 
      arrSzAlphas[generator.nextInt(arrSzAlphas.length)] + arrSzAlphas[generator.nextInt(arrSzAlphas.length)] 
       + Integer.toString(generator.nextInt(99)) + Integer.toString(generator.nextInt(9)) + " " 
       + arrSzAlphas[generator.nextInt(arrSzAlphas.length)] + arrSzAlphas[generator.nextInt(arrSzAlphas.length)]; 

     // Street and number 
     if (contacts.isSupportedArrayElement(Contact.ADDR, Contact.ADDR_STREET)) 
     addr[Contact.ADDR_STREET] = Integer.toString(generator.nextInt(999)) + " " 
      + arrSzStreetNames[generator.nextInt(arrSzStreetNames.length)] 
      + " " + arrSzStreetSuffixes[generator.nextInt(arrSzStreetSuffixes.length)]; 

     // Locality 
     if (contacts.isSupportedArrayElement(Contact.ADDR, Contact.ADDR_LOCALITY)) 
     addr[Contact.ADDR_LOCALITY] = arrSzCities[generator.nextInt(arrSzCities.length)]; 
     // Country 
     if (contacts.isSupportedArrayElement(Contact.ADDR, Contact.ADDR_COUNTRY)) 
     addr[Contact.ADDR_COUNTRY] = arrSzCountries[generator.nextInt(arrSzCountries.length)]; 
     if (contacts.isSupportedField(Contact.ADDR)) 
     contact.addStringArray(Contact.ADDR, Contact.ATTR_HOME, addr); 

     // Email address 
     if (contacts.isSupportedField(Contact.EMAIL)) { 
     contact.addString(Contact.EMAIL, Contact.ATTR_HOME | Contact.ATTR_PREFERRED, szName[Contact.NAME_GIVEN] + "." + szName[Contact.NAME_FAMILY] + "@" + arrSzEmailProviders[generator.nextInt(arrSzEmailProviders.length)] + ".com"); 
     } 

     // Telephone numbers (work and home) 
     String szTelHome = ""; 
     String szTelWork = ""; 
     for (int j = 0; j < 7; j++) { 
     String szDigit = Integer.toString(generator.nextInt(9)); 
     szTelHome = szTelHome + szDigit; 
     szTelWork = szDigit + szTelWork; 
     } 
     if (contacts.isSupportedField(Contact.TEL)) { 
     contact.addString(Contact.TEL, Contact.ATTR_HOME, szTelHome); 
     } 
     if (contacts.isSupportedField(Contact.TEL)) { 
     contact.addString(Contact.TEL, Contact.ATTR_WORK, szTelHome); 
     } 

     try { 
     contact.commit(); 
     } catch (PIMException e) { 
     // An error occured 

     } 
    } 

    try { 
     contacts.close(); 
    } catch (PIMException e) { 
    } 
    } 
+0

爲什麼要在第一個地方創建2000個聯繫人? – 2011-05-27 13:44:41

+0

我認爲這與我的問題無關。順便說一句,我有我的地址簿中至少有2000個聯繫人,所以我不認爲它的不尋常或不尋常。 – Yasser 2011-05-27 19:18:31

+0

你確定這是聯繫人添加,這需要很長時間,而不是隨機的聯繫人生成? – jprofitt 2011-05-31 13:56:44

回答

2

對於2000個聯繫人,26分鐘表示每個聯繫人780毫秒。

1)。你可以檢查contact.commit();是不是最費時的電話嗎?你可以這樣做相對準確,如下所示:

long timeSpentOnCommits; // defined somewhere at a top level 
... 
long start = System.currentTimeMillis(); 
contact.commit(); 
long taken = System.currentTimeMillis() - start; 
timeSpentOnCommits += taken; 
... 
// then after the all contacts have been added you can get 
// an average commit time: 
long timePerOneCommit = timeSpentOnCommits/2000; 
// view the got value in a `Dialog` or some logging 

如果大部分時間需要,那麼我認爲你不能改善它。 2)。另一個想法 - 在'for'循環中,你創建了太多的對象,所以這迫使操作系統太頻繁地調用垃圾收集(這是一件耗時的事情)。

改爲使用StringBuffer。因此,而不是在

addr[Contact.ADDR_POSTALCODE] = 
    arrSzAlphas[generator.nextInt(arrSzAlphas.length)] 
    + arrSzAlphas[generator.nextInt(arrSzAlphas.length)] 
    + Integer.toString(generator.nextInt(99)) 
    + Integer.toString(generator.nextInt(9)) 
    + " " 
    + arrSzAlphas[generator.nextInt(arrSzAlphas.length)] 
    + arrSzAlphas[generator.nextInt(arrSzAlphas.length)]; 

使用這個的:

addr[Contact.ADDR_POSTALCODE] = new StringBuffer() 
    .append(arrSzAlphas[generator.nextInt(arrSzAlphas.length)]) 
    .append(arrSzAlphas[generator.nextInt(arrSzAlphas.length)]) 
    .append(generator.nextInt(99)) 
    .append(generator.nextInt(9)) 
    .append(' ') 
    .append(arrSzAlphas[generator.nextInt(arrSzAlphas.length)]) 
    .append(arrSzAlphas[generator.nextInt(arrSzAlphas.length)]) 
    .toString(); 

注意StringBuffer.append()超載的任何原始類型,因此它可以接受整型和字符直接而不需要轉換爲String對象。

對於生成電話號碼應使用相同的方法。 3)。通過提取'for'循環中的所有重複調用可以獲得較小的速度提升。例如,你只需要計算你需要多少次調用arrSzAlphas.length(2000次迭代* 4每次迭代調用= 8000次!),而你可以在循環之前調用它,並將其存儲在循環中可見的最終局部變量中。這同樣適用於一組contacts.isSupportedXXXX調用 - 您不應該在所有迭代中反覆調用它,只需在循環開始之前調用它即可。

+0

當我問這個問題時,我知道commit()調用佔用了大部分時間,所以我要求解釋爲什麼會這樣,以及是否可以改進。所有其他改進都很小或不重要。 – Yasser 2011-06-07 06:46:06

+0

@Yasser。好的,我認爲你應該以更明確的方式說明縮小到contact.commit()調用的範圍。 – 2011-06-07 07:20:34

+0

是的,對不起。我明顯有興趣把時間從26分鐘縮短到5分鐘,而不是26分鐘到25分鐘58秒。 – Yasser 2011-06-07 09:37:24