Ios 将其矢量化,按字符串筛选字符串数组?GPU管道?

Ios 将其矢量化,按字符串筛选字符串数组?GPU管道?,ios,arrays,swift,search,vectorization,Ios,Arrays,Swift,Search,Vectorization,我确实这样搜索过,但没有找到使用MPICH或矢量化之类的东西。在fortran中,我会使用MPICH分解代码以使其瘫痪 这是在iPad上运行的,可以使用金属 我有一个包含数十万个元素的一维字符串数组,其中许多是重复的。我想找到副本的索引 到目前为止,我使用的是简单的循环,但它的速度很慢,所以我正在寻找一种方法来矢量化这个或分而治之,如果可能的话?或者有一种方法可以使用金属管道 class func filterDatabyString(dataString:[String],filterSt

我确实这样搜索过,但没有找到使用MPICH或矢量化之类的东西。在fortran中,我会使用MPICH分解代码以使其瘫痪

这是在iPad上运行的,可以使用金属

我有一个包含数十万个元素的一维字符串数组,其中许多是重复的。我想找到副本的索引

到目前为止,我使用的是简单的循环,但它的速度很慢,所以我正在寻找一种方法来矢量化这个或分而治之,如果可能的话?或者有一种方法可以使用金属管道

  class func filterDatabyString(dataString:[String],filterString:String) -> [Int]
  {
    var arrayIndex:[Int] = []
    var i:Int = 0

    for (i = 0; i < dataString.count; i++) {
      if dataString[i] == filterString
      {
        arrayIndex.append(i)
      }
    }

    return (arrayIndex)
  }
类func filterDatabyString(数据字符串:[String],filterString:String)->[Int]
{
var arrayIndex:[Int]=[]
变量i:Int=0
对于(i=0;i

如果您只需要索引,那么这个例子就足够了。我不确定这是否会更快。有点奇怪。

您可以将
dataString
数组设置为
NSArray
并同时枚举。像这样的怎么样

func filterDataByString(dataString:[String], filterString:String) -> [Int]
{
    var arrayIndex = [Int]()
    let data = dataString as NSArray
    data.enumerateObjectsWithOptions(.Concurrent) { (string: AnyObject!, index: Int, stop:UnsafeMutablePointer<ObjCBool>) -> Void in
        if(string as! String == filterString)
        {
            arrayIndex.append(index)
        }
    };

    return arrayIndex
}
func filterDataByString(数据字符串:[String],filterString:String)->[Int]
{
var arrayIndex=[Int]()
让data=dataString作为NSArray
data.EnumerateObjectsWithoOptions(.Concurrent){(字符串:AnyObject!,索引:Int,停止:UnsafeMutablePointer)->中的Void
if(字符串为!字符串==filterString)
{
arrayIndex.append(索引)
}
};
返回数组索引
}

那么,为什么要查找重复项的索引?还有,不是所有的副本都一样吗?那么,为什么需要将它们全部放入一个数组中呢?将它们放入一个散列中。如果它存在,那就是重复的。你否决了我的问题吗?不,还有其他数组具有依赖性,所以我需要索引。放入哈希似乎会增加更多开销。既然我已经有了数组,为什么还要转换成散列呢?我还需要索引,散列是无序的。通常使用散列进行O(1)搜索。看看你当前的代码,你应该得到O(n^2),而不是整个代码的O(n),再多的并行化也无助于克服这一点。谢谢,我也将对其进行基准测试。你知道有什么方法可以利用GPU来实现这一点吗?你可能想研究一下。但不要认为它在iOS上可用。至少不公开。关于使用OpenGL来实现这一点,以及如何使用它。很酷,谢谢。我将编写一些OpenCL/Metal代码并生成一个基准测试。。。只要这个问题没有被投票遗忘。如果是这样,我将PM您计时。平均运行20次后,使用
EnumerateObjectsWithoOptions(.Concurrent)
比简单循环快约1.5倍。因为您只需要索引,所以我更改了答案。我想知道
map
for loop
或Ben Kane的例子相比有多快。好的,给我一点时间,我不确定map有多少开销。我在perl中使用map,但perl针对此类操作进行了优化。这张地图不回布尔吗?我已经试过了。本的例子是迄今为止最快的。哇,看来我复制粘贴了错误的代码!Ben的代码比地图快了多少数量级?我现在要尝试一下OpenCL代码。好吧,有了filter/map,它看起来更好了。它不可能打败Ben的代码,这是并发的。在我对10000个对象的测试中,Ben的代码用了3秒2,51秒完成,而使用filter/map则用了7,72秒。
func filterDataByString(dataString:[String], filterString:String) -> [Int]
{
    var arrayIndex = [Int]()
    let data = dataString as NSArray
    data.enumerateObjectsWithOptions(.Concurrent) { (string: AnyObject!, index: Int, stop:UnsafeMutablePointer<ObjCBool>) -> Void in
        if(string as! String == filterString)
        {
            arrayIndex.append(index)
        }
    };

    return arrayIndex
}