Skip to content

Commit

Permalink
use threadlocal random generator to avoid contention
Browse files Browse the repository at this point in the history
  • Loading branch information
eivanov89 committed Sep 26, 2023
1 parent 109064e commit 42768b8
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.oltpbenchmark.api.LoaderThread;
import com.oltpbenchmark.benchmarks.tpcc.pojo.*;
import com.oltpbenchmark.catalog.Table;
import com.oltpbenchmark.util.ThreadLocalRandomGenerator;
import com.oltpbenchmark.util.SQLUtil;

import java.sql.*;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/oltpbenchmark/benchmarks/tpcc/TPCCUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
package com.oltpbenchmark.benchmarks.tpcc;

import com.oltpbenchmark.benchmarks.tpcc.pojo.Customer;
import com.oltpbenchmark.util.RandomGenerator;
import com.oltpbenchmark.util.ThreadLocalRandomGenerator;

import java.sql.ResultSet;
import java.sql.SQLException;
Expand Down Expand Up @@ -59,7 +59,7 @@ public static Customer newCustomerFromResults(ResultSet rs)
return c;
}

private static final RandomGenerator ran = new RandomGenerator(0);
private static final ThreadLocalRandomGenerator ran = new ThreadLocalRandomGenerator();

public static String randomStr(int strLen) {
if (strLen > 1) {
Expand Down
124 changes: 124 additions & 0 deletions src/main/java/com/oltpbenchmark/util/ThreadLocalRandomGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
/*
* Copyright 2023 by OLTPBenchmark Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/


package com.oltpbenchmark.util;

import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomGenerator {

/**
* Constructor
*
* @param seed
*/
public ThreadLocalRandomGenerator() {
}

/**
* Returns a random int value between minimum and maximum (inclusive)
*
* @param minimum
* @param maximum
* @returns a int in the range [minimum, maximum]. Note that this is inclusive.
*/
public int number(int minimum, int maximum) {

int range_size = maximum - minimum + 1;
int value = ThreadLocalRandom.current().nextInt(range_size);
value += minimum;

return value;
}

/**
* Returns a random long value between minimum and maximum (inclusive)
*
* @param minimum
* @param maximum
* @return
*/
public long number(long minimum, long maximum) {

long range_size = (maximum - minimum) + 1;

// error checking and 2^x checking removed for simplicity.
long bits, val;
do {
bits = (ThreadLocalRandom.current().nextLong() << 1) >>> 1;
val = bits % range_size;
}
while (bits - val + range_size < 0L);
val += minimum;


return val;
}

/**
* @param decimal_places
* @param minimum
* @param maximum
* @return
*/
public double fixedPoint(int decimal_places, double minimum, double maximum) {


int multiplier = 1;
for (int i = 0; i < decimal_places; ++i) {
multiplier *= 10;
}

int int_min = (int) (minimum * multiplier + 0.5);
int int_max = (int) (maximum * multiplier + 0.5);

return (double) this.number(int_min, int_max) / (double) multiplier;
}

/**
* @returns a random alphabetic string with length in range [minimum_length, maximum_length].
*/
public String astring(int minimum_length, int maximum_length) {
return randomString(minimum_length, maximum_length, 'a', 26);
}


/**
* @returns a random numeric string with length in range [minimum_length, maximum_length].
*/
public String nstring(int minimum_length, int maximum_length) {
return randomString(minimum_length, maximum_length, '0', 10);
}

/**
* @param minimum_length
* @param maximum_length
* @param base
* @param numCharacters
* @return
*/
private String randomString(int minimum_length, int maximum_length, char base, int numCharacters) {
int length = number(minimum_length, maximum_length);
byte baseByte = (byte) base;
byte[] bytes = new byte[length];
for (int i = 0; i < length; ++i) {
bytes[i] = (byte) (baseByte + number(0, numCharacters - 1));
}
return new String(bytes);
}
}

0 comments on commit 42768b8

Please sign in to comment.