Как вы правильно отметили, один или несколько токенов / идентификаторов вызывают проблему. Механизм автокорреляции VS не подходит для них, и они воспроизводятся как записанные вместо использования динамических значений, генерируемых сервером для каждого сеанса клиента в реальном времени.
Чтобы исправить это, вам нужно найти и вручную коррелируют такие значения динамики, создавая правила и параметры извлечения, которые могут быть довольно трудоемкими. Проверьте наш Web Test Builder для Visual Studio здесь , чтобы автоматически создавать отсутствующие экстракторы и параметр.
Следующее намного быстрее:
f <- function(x){
log2(bitwAnd(x,-x))
}
Для сравнения:
g <- function(x){
unlist(lapply(x, function(z) min(which(as.integer(intToBits(z)) == 1))-1))
}
Быстрый тест:
> library(microbenchmark)
> tests <- floor(runif(1000,1,2^31))
> sum(f(tests) == g(tests)) #just to check
[1] 1000
> microbenchmark(f(tests),g(tests))
Unit: microseconds
expr min lq mean median uq max neval
f(tests) 38.435 40.5515 45.82673 42.667 45.1355 146.337 100
g(tests) 1985.940 2083.9680 2530.79036 2131.218 2287.4280 11749.204 100
Если у вас длинные векторы и вы хотите перейти на C ++, вам может помочь следующий код (вместе с Rcpp
и функцией ffs
из strings.h
):
#include <Rcpp.h>
#include <strings.h>
using namespace Rcpp;
// [[Rcpp::export]]
Rcpp::IntegerVector lsb(const IntegerVector x)
{
IntegerVector res(x.size());
std::transform(x.begin(), x.end(), res.begin(), ffs);
return(res-1); # To start from 0
}
Сохраните код выше в виде файла, скажем lsb.cpp
, и скомпилируйте его, используя sourceCpp("lsb.cpp")
из пакета Rcpp
.
Это немного быстрее - по крайней мере для более длинных входных векторов, где издержки становятся незначительными
> x <- floor(runif(10000,1,2^31))
> microbenchmark::microbenchmark(f(x), g(x), lsb(x))
Unit: microseconds
expr min lq mean median uq max neval
f(x) 121.771 129.6360 168.91273 133.241 151.0110 1294.667 100
g(x) 36165.757 40508.1740 50371.45183 42608.686 60460.5270 94664.255 100
lsb(x) 25.767 26.8015 34.58856 33.035 35.2385 156.852 100