`
simen_net
  • 浏览: 306258 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

验证是否为数字(小数)的性能测试

阅读更多

最近看了几本关于JAVA编程效率优化的数,感触颇多。刚好做到一个地方需要验证是否为数字(小数),Google了几个方法进行了比较和改进:

测试代码:

  public static boolean isNumeric1(String str) {
    for (int i = str.length(); --i >= 0;) {
      if (!Character.isDigit(str.charAt(i))) {
        return false;
      }
    }
    return true;
  }

  public static boolean isNumeric2(String str) {
    Pattern pattern = Pattern.compile("[0-9]*");
    return pattern.matcher(str).matches();
  }

  public static boolean isNumeric3(String str) {
    if (str.matches("\\d*")) {
      return true;
    } else {
      return false;
    }
  }

  public static boolean isNumeric4(String str) {
    for (int i = str.length(); --i >= 0;) {
      int chr = str.charAt(i);
      if (chr < 48 || chr > 57)
        return false;
    }
    return true;
  }

  /**
   * @param args
   */
  public static void main(String[] args) {
    long s1 = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
      test.isNumeric1("1111111111111111111111111111111111111111111111d");
    }
    long s2 = System.currentTimeMillis();
    System.out.println("isNumeric1:" + (s2 - s1));
    for (int i = 0; i < 1000000; i++) {
      test.isNumeric2("1111111111111111111111111111111111111111111111d");
    }
    long s3 = System.currentTimeMillis();
    System.out.println("isNumeric2:" + (s3 - s2));
    for (int i = 0; i < 1000000; i++) {
      test.isNumeric3("1111111111111111111111111111111111111111111111d");
    }
     long s4 = System.currentTimeMillis();
     System.out.println("isNumeric3:" + (s4 - s3));
     for (int i = 0; i < 1000000; i++) {
     test.isNumeric4("1111111111111111111111111111111111111111111111d");
     }
     long s5 = System.currentTimeMillis();
     System.out.println("isNumeric4:" + (s5 - s4));
     for (int i = 0; i < 1000000; i++) {
     org.apache.commons.lang.StringUtils.isNumeric("1111111111111111111111111111111111111111111111d");
     }
     long s6 = System.currentTimeMillis();
     System.out.println("isNumeric5:" + (s6 - s5));
  }

 测试结果:

isNumeric1:42
isNumeric2:1614
isNumeric3:1355
isNumeric4:27
isNumeric5:195

 看起来isNumeric4胜出较多,但是先别下结论,将测试数据改为d111111111111111111111111111111111111111111111结果如下:

isNumeric1:65
isNumeric2:1305
isNumeric3:1087
isNumeric4:42
isNumeric5:104

 虽然优势不那么明显但还是isNumeric4胜出

 

改进:isNumeric4虽然快,但也只能分析正整数,因此调整其为:

  public static boolean isNumeric4(String str) {
    boolean flag = true;
    int length = str.length();
    for (int i = length; --i >= 0;) {
      int chr = str.charAt(i);
      if (chr < 48 || chr > 57) {
        if (i == 0 && (chr == 45 || chr == 43)) {
          continue;
        } else if (i != length -1 && i != 0 && (flag && chr == 46)) {
          flag = false;
          continue;
        } else {
          return false;
        }
      }
    }
    return true;
  }

 这样就可以基本识别小数并且最前面可以带“+”、“-”,再进行两次测试:

字符串为:1111111111111111111111111111111111111111111111d

isNumeric1:44
isNumeric2:1586
isNumeric3:1763
isNumeric4:38
isNumeric5:178
 

字符串为:d1111111111111111111111111111111111111111111111

isNumeric1:146
isNumeric2:1034
isNumeric3:672
isNumeric4:212
isNumeric5:98

 可见使用第二种字符串测试其性能低于了isNumeric1,但在功能上这点牺牲还是可以接受的。

 

虽然使用了超多次循环来测试,但每次的测试数据还是不能统一,可能和java虚拟机不同时候的性能有关系,所以这里只对同次测试的数据进行比较。

结论:考虑到各种情况,最优效率是将验证整数和整数(小数)分开,在能够判确认的情况下尽量使用整数验证。

 

 

 

分享到:
评论

相关推荐

    验证文本框只能输入数字和小数点

    if (keyCode &gt;= 48 && keyCode || keyCode == 46 || keyCode == 8) { // 判断是否为数字、小数点或退格键 if (keyCode == 8) { // 处理退格键 event.returnValue = true; return; } if (keyCode == 46) { // ...

    NOIP2011年普及组复赛试题第一题《数字反转》测试数据10组

    在编程比赛中,测试数据是验证解决方案是否正确的重要工具,通常包含各种边界条件和特殊情况。这10组数据可能是由小到大、包含零、负数以及可能的重复数字等,目的是确保参赛者的代码能够处理各种可能的情况。 ...

    python 3 实现NIST二进制序列随机测试

    这些脚本可能包括了如极性测试、块频率测试、运行测试、非重叠模板测试、重叠模板测试、游程测试、相邻位差分测试、长距离相关性测试、傅立叶分析测试、循环结构测试、块频域自相关测试等。 2. **输入/输出处理**:...

    基于FPGA的板卡自动化测试方案的设计与实现.pdf

    在当今的电子工程领域,FPGA(现场可编程门阵列)因其灵活性和高性能而被广泛应用于各种硬件设计与测试中。FPGA允许工程师通过编程来实现复杂的逻辑功能,而且它在原型开发和系统验证中扮演着重要角色。特别是在板卡...

    小数数学滤波器超详细讲解

    总的来说,这个压缩包提供了一个全面学习和实践小数数学滤波器的资源,包括理论知识、MATLAB实现以及相关的性能测试。通过阅读文档、理解和运行代码,不仅可以掌握小数延迟滤波器的基本原理,还能提升在MATLAB环境中...

    黑盒测试实验报告

    在实验的准备阶段,测试计划参照了GB8567——88的标准,明确了测试目标,包括界面测试、功能测试和性能测试。测试对象是Windows 7操作系统中的计算器,同时参考了计算器的帮助文档和《软件测试》的相关教学材料。 ...

    移动端html5带小数点的数字软键盘

    例如,限制小数位数,确保输入的数字在指定范围内等。 8. **事件委托**: 当键盘按钮较多时,使用事件委托可以提高性能。在键盘容器上设置一个事件监听器,而不是在每个按钮上单独设置,这样可以减少事件处理器的...

    公共测试用例

    - **输入框验证**:包括手机号码输入框验证、email验证、数字框验证(通用数字框、两位小数、正数、整数)、字符类输入框、必填项验证、验证码验证、附件图片类验证等。此类测试用例重点在于验证用户输入的有效性和...

    软件测试报告黑盒测试.pdf

    本报告以人民币数字大写转换软件为例,详细阐述了黑盒测试的运用,包括等价类划分法、边界值分析法以及因果图法。 首先,我们来理解等价类划分法。在本例中,测试目标是检查软件能否正确地将人民币数字转化为大写...

    java 数字转化为汉字大写

    - 创建测试方法,传入不同的数字,调用上述逻辑,验证转换结果。 在给定的压缩包中,`Java数字换成汉字大写`应该就是实现了以上逻辑的Java类。通过直接运行和测试这个类,我们可以快速检查其功能是否符合预期。这...

    大数小数四则运算链表实现

    **设计书** 和**实验报告** 是项目实施过程的重要组成部分,它们记录了设计思路、算法选择、代码实现以及测试结果,有助于理解整个系统的运作机制和性能表现。 **程序的Release版** 和**程序文件** 提供了实际运行...

    基于FPGA的任意小数分频器的设计

    3. **测试与验证**:使用Quartus II软件进行仿真验证,确保设计正确无误。 4. **硬件资源评估**:在Cyclone系列的EP1C12Q240C8芯片上实现设计,评估所使用的硬件资源。 #### 设计实例 以将13MHz的时钟信号分频为8...

    WEB前端测试点汇总整理

    5. **性能测试** - **页面加载速度**:测量页面加载时间,优化资源加载,减少阻塞。 - **响应时间**:测试交互元素的响应速度,确保用户体验流畅。 - **内存占用**:监控应用运行时的内存占用,防止内存泄漏。 6...

    金额大写_数字金额转换_

    首先,函数需要将数字金额拆分为整数部分和小数部分,分别处理。对于整数部分,可以使用循环和条件判断,逐位转换;小数部分同样,但需要注意小数点后的位数限制,通常财务中最多保留两位小数。 3. **处理特殊情况*...

    测试用例编写技巧

    测试用例是软件开发过程中的重要组成部分,它用于验证软件功能是否按照预期工作,确保产品质量。高效的测试用例编写能够帮助我们发现潜在的错误和缺陷,从而提高软件的可靠性和稳定性。以下是一些关于测试用例编写...

    YOLO数字仪表读数数据集

    在这个名为"YOLO数字仪表读数数据集"的资源中,我们可以看到专门为YOLO模型定制的一组训练数据,目的是帮助模型学习识别数字万用表上的读数。 首先,这个数据集包含1156张图像,这些图像被分为了训练集、验证集和...

    小数分频模块

    小数分频模块是一种能够对输入时钟信号进行精确小数倍分频处理的数字电路模块。它不仅支持整数分频,还支持小数分频,可以实现非常灵活且精准的频率调整功能,在电子工程、通信系统等领域有广泛的应用。 #### 二、...

    web测试方法

    以上测试方法是Web测试的基本步骤,但还需要结合具体的业务逻辑和用户场景进行更深入的测试,例如权限测试、性能测试、兼容性测试、安全性测试等,以确保Web应用程序的全面质量。在执行这些测试时,应记录测试结果,...

Global site tag (gtag.js) - Google Analytics