Blackberry PIM为什么联系人创建如此缓慢?

问题描述

| 以下代码是我从blackBerry论坛上获取的,花费了将近26分钟的时间,才能在8500系列设备上使用BB PIM API创建2000个随机联系人。有谁知道为什么要花这么长时间或如何提高通讯录中联系人创建的性能
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\",\"JOHN\",\"ROBERT\",\"MICHAEL\",\"WILLIAM\",\"DAVID\",\"RICHARD\",\"CHARLES\",\"JOSEPH\",\"CHRISTOPHER\",\"DANIEL\",\"PAUL\",\"MARK\",\"DONALD\",\"GEORGE\",\"KENNETH\",\"STEVEN\",\"EDWARD\",\"BRIAN\",\"RONALD\",\"ANTHONY\",\"KEVIN\",\"JASON\",\"MATTHEW\",\"GARY\",\"TIMOTHY\",\"JOSE\",\"LARRY\",\"JEFFREY\",\"FRANK\",\"ERIC\",\"STEPHEN\",\"ANDREW\",\"RAYMOND\",\"GREGORY\",\"JOSHUA\",\"JERRY\",\"DENNIS\",\"WALTER\",\"PATRICK\",\"PETER\",\"HAROLD\",\"DOUGLAS\",\"CARL\",\"ARTHUR\",\"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\",\"grove\",\"Place\",\"Mill\",\"Manor\",\"Lane\",\"march\",\"Hill\",\"Park\",\"Passage\",\"Path\",\"Row\",\"Square\",\"Terrace\",\"View\"};

    String arrSzStreetNames[] = {\"High\",\"Station\",\"Main\",\"Church\",\"London\",\"Victoria\",\"Albert\",\"Green\",\"Queens\",\"New\",\"Grange Road\",\"Kings Road\",\"north\",\"West\",\"South\",\"East\",\"Windsor\",\"Highfield\",\"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,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) {
    }
  }
    

解决方法

        Hm .. 2000分钟接触26分钟意味着每1个接触780毫秒。 1)。您能检查一下ѭ1不是最耗时的电话吗?您可以使用smth这样比较准确地做到这一点:
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 \'循环中,您创建了太多的“ 3”对象,因此这迫使OS过于频繁地调用垃圾回收(这很耗时)。 改用
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();
请注意,任何原始类型都将重载“ 7”,因此它可以直接接受int和char,而无需转换为“ 3”对象。 电话号码生成应使用相同的方法。 3)。通过从\'for \'循环中提取所有重复调用,可以提高速度。例如,仅计算调用ѭ9的次数(2000次迭代*每个迭代4次调用= 8000次!),而您可以只在循环之前调用一次,并将其存储在循环可见的最终局部变量中。一组
contacts.isSupportedXXXX
调用也是如此-您不应一遍又一遍地调用它,而应在循环开始之前调用一次。