2011-05-27 76 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

相关问题